Et la securité dans tout ca.... [PHP] - PHP - Programmation
Marsh Posté le 29-11-2002 à 13:44:32
Y a un début là : http://www.php.net/manual/fr/security.php
Marsh Posté le 29-11-2002 à 14:00:36
Merciiii je vais y jete un oeil :-)
Si vous avez d'autres link n'hésitez pas....
Marsh Posté le 10-01-2003 à 16:52:57
donc voila la suite du topic securité
Donc jai programmé en debut de semaine et cette nuit, je suis tombé la dessus :
http://www.phpsecure.org/index.php?zone=pArticle
Pas mal d'infos sur les failles de lupload, les includes, les variables globales ...
Je mettrais dans la suite ce que jai fait ( et sans doute ce que javais oublié), mais ca prendra peut etre un peu de temps, donc je voudrais savoir si certains pourraient tester ce que ca donne
(vais essayer de faire mieux que la banque de credit maritime pr ceux qui se rappelle)
je laisse les urls un ptit peu, apres je les enleves.
http://XXX/nonox/index.php
apache/mysql configuré moyen, faudrait que je my plonge.
register_global off
safe_mode on
affichage des erreurs off
listing des repertoires
le site en prod
http://www.XXX.com/
apache/mysql on fait confiance a ovh
register_global on OVH ( je dois arriver a le mettre a 0 via ini_set)
safe_mode on
affichage des erreurs off
listing des repertoires mais htacess, index.html
voili voilou
Marsh Posté le 10-01-2003 à 17:20:40
ethernal a écrit : on peut pas s'inscrire ?? |
ste honte ... je regarde
edit : une ligne rajoutée a 2h27 un peu en trop, on peut rien faire sans etre loggué, nimporte koi. c corrigé.
DSL
Marsh Posté le 10-01-2003 à 17:35:11
moi jsuis couvert, ethernal m'a fait un audit
au fait jte dois combien ?
Marsh Posté le 10-01-2003 à 18:07:42
Sh@rdar a écrit : moi jsuis couvert, ethernal m'a fait un audit |
prix d'ami : gratuit !
bon je suis pas non plus un pirate de la mort qui tue comme il en existe certainement... donc je garanti rien.
un code propre limite les dégats, c'est tout, une faille, le site ou le serveur sont en périls.
un résumé :
- auscultez ce que vous incluez, interdire les includes distants
- faire attention à ce que l'ont ne puisse pas non plus inclure des pages de l'administration dans le site de base et passer outre les protections, voir afficher des fichiers de l'ordinateur (j'ai déjà affiché un autoexec.bat dans une page html d'un site, c'est assez drôle...)
- pas de html (pour la mise en page)
- attention au Cross scripting (code javascript qui permet de transmettre vos cookies à qq d'autre)
- ne jamais afficher la query en cas d'erreur
- toujours tester les valeurs qui seront utilisées pour la query
- les encadrer par des '' même si c'est un chiffre
- vérifier le contenu du fichier uploadé
- son nom (un nom de type ../../htaccess irait écraser votre fichier de pwd sous linux).
- attention à votre méthode de protection... renommer les fichiers uploadés en .txt ou . gif, on pourrait renommer vos fichier php avec une extension autre ce qui permettrait de le lire en clair
- ne jamais croire que les scripts que l'ont trouve gratuitement sur le net sont sécurisé... genre une gallerie photo (j'en ai déjà vu qui permettent de lister les répertoires et d'afficher les fichiers php en clair)
- toujours empêcher le listing des répertoires
- se tenir à jour sur les failles de sécurité d'apache ou de php
- ne pas laisser ses pwd/login dans des exemples que l'ont diffuse sur son site... classique
bon je suis fatigué là
a+
Marsh Posté le 10-01-2003 à 18:10:21
ethernal a écrit : |
PTDR !!
Marsh Posté le 10-01-2003 à 18:18:30
j'ajoute ma pierre à l'édifice
utilisez plus le switch() et ajoutez toujours un else{} aux if{}
pourquoi ?
le switch() permet d'avoir une valuer default; qui prendra le relais en cas de résultat inattendu, idem pour le else
toujours prévoir une porte de sortie "propre" (pour moi c'est page blanche sans msg d'erreur ou un minimum) pour éviter des "aléas"
dans tout les cas, il faut bien réfléchir AVANT de coder, et ne PAS faire confiance au visiteur, à fortiori encore plus quand on code coté serveur.
Marsh Posté le 10-01-2003 à 18:19:17
Sh@rdar a écrit : |
c'est du vécu
si tu vois d'autres choses, n'hésite pas
j'ai faim donc je réfléchis mal
Marsh Posté le 10-01-2003 à 18:31:23
ethernal a écrit : |
je fais des crepes, jai du porc au vin blanc, des noodles, de la biere
je posterais des trucs a mon retour ce soir
Marsh Posté le 10-01-2003 à 18:36:55
beleg a écrit : |
j'en ai l'eau à la bouche (y a pas de smileys qui bavent??)
a demain
Marsh Posté le 10-01-2003 à 19:44:30
un petit conseil: porter 10 x plus d'attention lorsqu'il sagit d'un fonction importante dans un script par exemple "rajouter un modo,admin super admin dans un forum".Cette action devrait etre au minimum entouré d'un protection par cookies,d'un verification de mot de passe dans la base de donné avant d'executer la requete.
-pour les formulaire de mail,ne pas oublier de proteger contre le flood,car si le gars rafraichit la page 1000 fois
-htmlentities() et htmlspecialchar() est presque obligatoire pour un formulaire ou autre donné entré par l'utilisateur.
-toujours crypter les mots de passe dans la base de donné,comme ca si on vous pirate la bdd,le mot de passe resterons secret.
si j'ai dis des betises,dite le moi.
Marsh Posté le 10-01-2003 à 20:14:57
pas de conneries mais quelques généralités ou imprécisions
forummp3 a écrit : un petit conseil: porter 10 x plus d'attention lorsqu'il sagit d'un fonction importante dans un script par exemple "rajouter un modo,admin super admin dans un forum".Cette action devrait etre au minimum entouré d'un protection par cookies,d'un verification de mot de passe dans la base de donné avant d'executer la requete. |
Marsh Posté le 10-01-2003 à 21:01:27
pour les <> et '' tu peux developper?
Pour les Variables globales quels sont les risques?
Marsh Posté le 10-01-2003 à 21:07:54
laisser un utilisateur saisir hors encodage html des caractères comme > < ou " lui permettra de faire
<script language="php">
echo get_defined_vars();
</script>
ou
<?php ... ?>
par exemple
tu saisis l'importance de < ou > ?
Marsh Posté le 10-01-2003 à 21:36:55
AGA a écrit : pour les <> et '' tu peux developper? |
tu saisis ca ici
[i mg] http://forum.hardware.fr/images/perso/shakalagoons.gif" onmouseover="alert('huhu' [/i mg]
c remplacé par
<img src="http://forum.hardware.fr/images/perso/shakalagoons.gif" onmouseover="alert('huhu' ">
taffiches le post, tu passes ta souris dessus et hop
avec le " encodé :
<img src="http://forum.hardware.fr/images/perso/shakalagoons.gif" onmouseover="alert('huhu' ">
croix rouge et basta
doit etre possible de rentrer quelque chose comme ca :
blablabla "; print_r($GLOBAL); echo " blablabla
dans un formulaire
et le php a l'affichage du poste fera
echo "$texte"; donc
echo "blablabla "; print_r($GLOBAL); echo " blablabla";
je vais me faire un petit serveur de test avec des formulaires non securisés
Marsh Posté le 10-01-2003 à 23:09:04
-les entiers : intval()
ca evite les page.php?id=666%20or%201=1&action=effacer
delete from table where idtable = $id;
delete from table where idtable = 666 or 1=1;
de maniere generale mes delete, update, select avec une condition sur l'identifiant comporte un limit 1.
-les chaines de caracteres svt issues des formulaires pr aller en base : htmlentities / htmlspecialchars
ou remplacer le html par ""
idem pr le javascript
remplacer " par "
utiliser des balises proprio [mail]
a laffichage : replacer les balises par du html.
-les noms de fichiers (cf ethernal)
a lupload : verifier extension, type, presence de chemin
en ouverture : url au lieu de local, fichier systeme
jutilise des classes interfaces/generiques pr les user / admin / database.
Dune ca me facilite la vie avec la base de données
$db->Query($query,1);
while ($db->Next())
{
$dbpassword = $db->Get("password",1);
$dbuser = $db->Get("iduser",1);
$dbmail = $db->Get("email",1);
}
$db->Free();
De deux, l'ensemble classe/sessions/database est puissant et permet une grande securité, a linterieur des fonctions le scope des variables est + limité.
classe admin
admin()
{
ouvrir session
si _SESSION["admin"]
{
aller chercher date de fin de session
si terminé
this->deconnecter
sinon
augmenter date de fin de session
}
else
{ _SESSION["admin"] = false }
}
verifier(login, pass)
{
pass = crypt(pass)
pass2 = aller chercher le pass pour le login
si pass2 = pass
{
//cest un admin
_SESSION["admin"] = true
augmenter date de fin de session
}
}
deconnecter()
{
detruire variable de session
fermer session
}
}
apres une page admin.php de la section admin peut etre :
A = new admin()
D = new database()
si existe (_GET["action"])
action = _GET["action"]
si A non admin
action = ""
fonction1(param, param, param, param)
{
PHP
...
?>
HTML
<?
}
fonction2(param, param, param, param)
{
PHP
...
?>
HTML
<?
}
switch(action) {
case "afficher" : fonction1 (D, _GET["param"], _POST["param"], _POST["param"])
case "login" : fonction2 (D, _GET["param"], _POST["param"], _POST["param"])
default : rien
}
jaurais une grosse tendance a utiliser admin.php pour laffichage et admin_valid pour les traitements, tt mes formulaires pointent sur admin_valid.php qui traitent les données et redirige sur admin.php avec un identifiant d'erreur si besoin. ca evite le rechargement des formulaires et ca permet de separer un max traitement PHP et HTML.
param serveur :
listing repertoire interdit
variable_global off
affichage erreur off
.php .php3 .php4 .inc => Interpreteur PHP
mettre des mots de passes aux users MySQL
oups je me suis emporté, désolé, mon livre paraitra donc aux editions guy tredaniel ... pas cher
Marsh Posté le 11-01-2003 à 11:51:54
Sh@rdar a écrit : pas de conneries mais quelques généralités ou imprécisions |
merci pour cette corection.Pour la securité de l'admin,je disait ca pour dire qu'un authentification pour rentrer dans la section admin n'est pas suffisant.Il faut ensuite reverifier si les cookies sont bont en referifient les mot de passe.
exemple sur ce forum,on peut poster sur le forum private sans ya voir accés,donc l'identité du posteur n'est pas referifier quand on poste,donc une faille et il parait que ca fait deux version qu'elle est pas corrigé ( car joce le sais)
Sinon ya aussi un autre forum ou ethernal avit reussi a devenir admin,meme super-admin a l'aide d'un simple url.(il avait le code source quand meme )
poue le mail je disait car on y pense pas toujours,alors que pour un forum,le premier truc qu'on pense c'est le flood dans un topic.Il faut aussi penser le flood dans les inscription,car si on met pas de limite,on peu avoir des milliers d'inscrit en une journé meme des millions.
pour le htmlentities() et htmlspecialchars() c'est le premier truc a se demander lorsque l'on fait un formulaire.On en a besoin dans 99% des cas meme lorsque l'on fait des echo""
ce n'est que des conseil pour debutant,car je le suis moi meme et j'ai fait des erreur similaire.
Si vous avez d'autre truc & astuce
Marsh Posté le 11-01-2003 à 12:00:26
j'ai oublié qq ch de très important pour les querys :
toujours escaper les ' et ", si la config du serveur ne le fait pas automatiquement... (\' \" )
$query= "select login from bd where login='$login' and password='$pwd'"
formlaire:
- login= login_existant
- pwd= test' or 'test'='test
sans l'escape de ' tu rentres sous le login que tu veux, avec non.
ça vaut pour toute les infos rentrée par les utilisateurs.
Marsh Posté le 11-01-2003 à 12:01:52
ethernal a écrit : j'ai oublié qq ch de très important pour les querys : |
ca veut dire koi escaper
Marsh Posté le 11-01-2003 à 12:12:32
c'est mettre un backslash (\) devant un caractère.
on le fait devant tout les caractères spéciaux '"()[]\ en fonction de leur signification dans le code que l'on utilise.
un htmlentities($var, ENT_QUOTES) permet de changer le " en quote, mais si tu veux garder un texte intacte, tu l'escape plutot que de le modifier en caractère html
Marsh Posté le 11-01-2003 à 12:13:49
en fait tu dit qu'il faut utiliser la fonction addslashes() ?
Marsh Posté le 11-01-2003 à 12:24:04
ça dépend de la config du serveur php.
certaines config rajoutent automatiquement des \ devant les caractères spéciaux reçus par $_GET, $POST, $_COOKIE, donc il ne faut pas le faire.
Si le serveur n'est pas configuré comme ça, oui il faut les rajouter.
php.ini : magic_quotes_gpc= On
tester la config du serveur: get_magic_quotes_gpc()
ps : gpc= Get Post Cookie
à savoir aussi :
certains serveurs sont configurés pour rajouter des \ lors de l'extraction de données de fichiers/bd/exec.
php.ini : magic_quotes_runtime= On
tester la config du serveur: get_magic_quotes_runtime()
il faut donc les enlever avec stripslashes() avant de les afficher...
Marsh Posté le 11-01-2003 à 12:56:57
et keski ce passe si on met addslashes et que le serveur rajoute deja les slash?
Marsh Posté le 11-01-2003 à 12:58:29
AGA a écrit : |
voir exemple : http://forum.hardware.fr/forum2.ph [...] subcat=393
Marsh Posté le 11-01-2003 à 13:01:45
forummp3 a écrit : et keski ce passe si on met addslashes et que le serveur rajoute deja les slash? |
1. tu postes '"
2. le serveur ajoute ses \ --> \'\"
3. tu ajoutes des \ --> \\\'\\\"
ça devient illisible et presque irrécupérable...
à éviter
pour faire un code compatible quel que soit le serveur d'hébergement, il faut tester la config du serveur avant d'ajouter/retirer des \ avec addslashes et stripslashes
Marsh Posté le 11-01-2003 à 13:18:34
et il faut faire quoi comme teste alors?
if(??????)
addslashes()
Marsh Posté le 11-01-2003 à 13:26:22
(cfr 3 poste plus haut)
réception de données à stocker (bd,fichier):
if (get_magic_quotes_gpc()==0)
$_GET['var']= addslashes($_GET['var']);
}
Affichage de données réceptionnées :
echo stripslashes($_GET['var']);
affichage de données provenant de bd, fichiers, exec()
if (get_magic_quotes_runtime()==1)
$var= stripslashes($var);
}
Marsh Posté le 11-01-2003 à 13:46:41
Suite au point des
<script language="php">
echo get_defined_vars();
</script>
ou
<?php ... ?>
passés dans par formulaire j'ai fait quelques tests moi aussi, j'ai tapé <?php echo "test"; ?> dans un formulaire qui est affiché directement sans protection ni fonctions quelconque. Le commentaire (j'ai utilisé mon script de commentaire a cet effet) est vide, rien ne s'affiche.
Dans phpMyAdmin j'ai bien le texte <?php echo "test"; ?> qui est rentré dans la base.
et de plus si j'affiche la source HTML de la page générée par Apache j'ai <td><?php echo "test"; ?></td> en clair.
Je ne sais pas exactement quoi en conclure mais j'espère avoir porté ma petite contribution
Marsh Posté le 11-01-2003 à 13:59:51
_Raynor_ a écrit : Suite au point des |
essaye de mettre coucou";<?php echo "test"; ?>"coucou
Marsh Posté le 11-01-2003 à 14:05:30
forummp3 a écrit : |
qqun a essayé :
mettre
blablabla "; print_r($GLOBAL); echo " blablabla
dans un formulaire
et le php a l'affichage du poste fera
echo "$texte"; donc
echo "blablabla "; print_r($GLOBAL); echo " blablabla";
Marsh Posté le 11-01-2003 à 14:07:27
beleg a écrit : |
ca me met des backslashes
Marsh Posté le 11-01-2003 à 14:25:37
prkoi ca marche pas ce que je fait.
j'ai comme code source:
Citation : <? |
je met dans l'url
Citation : ??id=blabla";echo"<script>alert(123)</script>";echo"blabla |
et j'ai ca comme resultat:
Citation : blabla";echo"";echo"blabla |
Marsh Posté le 11-01-2003 à 16:05:24
forummp3 >
test.php :
<?
$a1 = 666;
$a3 = "$a1";
$a4 = '$a1';
$a5 = "$a1 $a2 $a3 $a4";
echo "<br>".$a5;
?>
test.php?a2=$a1
renvoie
666 $a1 666 $a1
le contenu des variables _GET _POST ... ne sont pas evaluées (supposition).
Marsh Posté le 11-01-2003 à 18:49:54
et en terme de flood, qu'est-ce qu'y a comme technique qui marche bien?
Marsh Posté le 11-01-2003 à 20:36:56
dropsy a écrit : et en terme de flood, qu'est-ce qu'y a comme technique qui marche bien? |
tu veut un technique pour flooder ou pour eviter le flood?
Marsh Posté le 11-01-2003 à 20:43:31
forummp3 a écrit : |
pour éviter le flood bien sur
Marsh Posté le 29-11-2002 à 13:39:35
Bonjour a tous....
Apres avoir lu le topic sur le e-commerce je me pose une grande question...
Est ce qu'il existe des ouvrages ou des sites expliquant comment securiser au mieux son site internet fait en php...
Car j'apprend le php en autodidacte...et je suis convaincu qu'il pourrait y avoir plein de probleme avec ce que je fais....
Merci a ceux qui pourront m'aider...
A+
Grouzou