|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Bonjour,
Dans tous les exemples que j'ai lu sur le piratage par injection sql, c'était chaque fois des requêtes avec une clause WHERE qui étaient montrées en exemple. Ne peut-on donc pirater que des requêtes SELECT ou UPDATE ? |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : mars 2003 Messages : 1 158 ![]() |
As-tu lu les tutos du site sur la sécurité ?
__________________
Rédacteur PHP / Delphi ADO / Novell / OpenOffice.org Inutile de m'envoyer vos questions par MP, je ne réponds que par le forum. |
|
|
00
|
|
|
#3 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Oui mais ce n'était pas ces points qui m'intéressaient à ce moment, donc je n'ai pas dû les retenir. Je vais les relire. Mais si quelqu'un a la réponse, qu'il ne se prive pas. Merci
|
|
|
00
|
|
|
#4 | |
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 982 ![]() |
Citation:
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
j'ajouterais que TOUTES les requetes sont potentiellement dangeureuses, mais le niveau de sécurité depend aussi des fonctionnalités offertes par la base de données.
Si tu as une base de données qui autorise le caractere ";" entre 2 requetes pour en executer plusieurs par exemple, n'importe qu'elle requete est TRES dangeureuse. un exemple : SELECT * FROM matable WHERE ID=$_GET['id'] je te laisse faire le remplacement si je m'amuse a mettre dans l'URL de la page : ?id=1;DROP TABLE matable je t'invite fortement a lire les articles sur l'injection SQL disponibles ici
__________________
PHP : Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production) Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error()); Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable. Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/ |
|
|
00
|
|
|
#6 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Merci pour vos réponses,
Bon alors j'ai lu cette page : http://www.phpsecure.info/v2/article/InjSql.php Moi je fais mes requêtes comme ça : Code :
SELECT * FROM matable WHERE ID='.$id.' Donc là c'est incassable. Par contre, si c'est une chaine de caractère, je ne vois pas quoi faire d'autre à part : Code :
$chaine=mysql_real_escape_string($_GET['chaine]) ce qui nous donne Code :
$chaine= htmlspecialchars(mysql_real_escape_string($_GET['chaine']) Sans cela êtes vous certains que mysql_real_escape_string() est suffisant sur un champ texte pouvant contenir de tout ? |
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() ![]() Inscription : avril 2003 Messages : 3 286 ![]() |
Citation:
__________________
Tous mes tutoriels Pas de questions techniques par MP ni par e-mail, merci ! Prolog rules! |
|
|
|
00
|
|
|
#8 | |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Si je te suis :
est incassable (avec mysql_real_escape_string() avant) Alors que Citation:
On me l'a déjà dit, mais je n'ai toujours pas compris pourquoi une si petite différence permet de passer de l'insécurité à la sécurité "totale". |
|
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() ![]() Inscription : avril 2003 Messages : 3 286 ![]() |
J'aime pas parler de sécurité totale... Je vais juste donner un exemple.
J'utilise la variable suivante : avec simple quotes : Code :
"SELECT t,u FROM table WHERE t='$condition'"
Code :
SELECT t,u FROM table WHERE t='test AND u=10'
sans simple quotes : Code :
"SELECT t,u FROM table WHERE t=$condition"
Code :
SELECT t,u FROM table WHERE t=test AND u=10
__________________
Tous mes tutoriels Pas de questions techniques par MP ni par e-mail, merci ! Prolog rules! |
|
|
00
|
|
|
#10 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
c'est comme l'histoire des // pour passer la fin d'une requête comme commentaire ou un truc comme ça...
Bon alors les quotes plus le point autour de la variable passée en paramètre à la requête, le tout précédé par mysql_real_escape_string et on est tranquille pour tous les champs textarea, c'est ça ? |
|
|
00
|
|
|
#11 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Bon faudrait accorder nos violons parce que sur ce post d'une discussion que j'avais ouverte (finalement presque identique, décidemment je suis pas rassuré), il n'est pas dit cela.
http://www.developpez.net/forums/sho...77&postcount=6 Donc je reprend. Pour le moment je fais : et Fladnag dans le post au dessus dis que comme ça c'est bon, mais qu'il faut surtout éviter : Ce que je ne fais en fait pas, mais c'est de celà dont nous discutons ici. Donc mettons nous d'accord, il en va de la survie de l'humanité. |
|
|
00
|
|
|
#12 | |
|
Expert Confirmé
![]() ![]() Inscription : avril 2003 Messages : 3 286 ![]() |
Citation:
__________________
Tous mes tutoriels Pas de questions techniques par MP ni par e-mail, merci ! Prolog rules! |
|
|
|
00
|
|
|
#13 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
Bon, revenons au debut :
Citation:
TOUTES les failles de sécurités en PHP (a part les bugs occasionnels de certaines fonctions, et encore) proviennent toutes d'une seule et meme source : LES ENTREES UTILISATEURS Ton programme PHP peut etre assimilé a une boite avec des données en entrées et des choses produites en sorties. Si ton programme n'a pas de bug, les choses produites en sorties seront toujours correctes (un traitement qui a échoué est considéré comme correct si l'erreur est tracée, eventuellement un administrateur prévenu, mais là je rentre déjà trop dans les détails) Par contre, les données en entrées sont EXTREMEMENT SENSIBLES parce qu'elles arrivent a PHP sans aucun controle. C'est donc a toi de les controler et de faire en sorte qu'elles correspondent a ce que tu attends, qu'elles ne provoquent pas d'executions non voulues, etc... tu parle de la clause WHERE ? ben c'est uniquement parce que *en général* c'est dans la clause WHERE qu'on trouve les $_GET et les $_POST. mais si tu t'amuse a faire un SHOW COLUMNS FROM $_GET['table'] c'est potentiellement aussi une faille de sécurité. Voir meme, tant qu'on y est mysql_query($_GET['requete']); (mais là c'est flagrant que c'est dangeureux...) C'est donc a toi de tester, verifier le type, convertir, échapper, et faire en sorte que toutes les entrées utilisateurs soit : * Soit stoppées avant qu'elles ne provoquent un probleme * Soit converties en données traitables normalement. Apres, on entre trop dans les détails et c'est spécifique a chaque script PHP. addslashes, stripslashes, html_entities, mysql_real_escape_string, intval, oui, ces fonctions sont utiles... chaque fois que tu utilise une variable venant d'un utilisateur (et là je parle aussi bien de $_GET, $_POST, $_FILE que de $_COOKIE. $_SESSION est a part puisque sauf autre bug, l'utilisateur ne peux pas modifier directement les variables de session) demande toi ce qu'il se passe si il y a une apostrophe dedans, ou un guillemet, ou une balise html, ou un dollar (je pense a l'utilisation d'une fonction exec ou d'un preg_replace_callback), ou un slash (/) ou un antislash (\) et, dans CHAQUE cas, c'est a toi de trouver la fonction a utiliser pour rendre ton code sur. Il n'y a pas de fonction magique parce que la fonction a utiliser depend de ce que tu veux faire de ta variable ensuite (insertion dans une BDD, affichage, value d'un insert, etc...) LE MOYEN LE PLUS SUR RESTE L'ANALYSE INTELLIGENTE DE TON CODE. C'est a dire reflechir a chaque utilisation sur les failles potentielles. Maintenant, personne est parfait, et on peut oublier des trucs. Si tu veux une formule magique, voici la mienne : Utilise cette chaine dans TOUTES les entrées utilisateurs sur ton site (champs INPUT d'un formulaire, variable en GET dans l'url de la page, etc...) Si tu n'a aucune erreur SQL qui remonte, aucun affichage QUE TU NE SOUHAITES PAS (si tu souhaite afficher le code html il est normal que <b> et <br> soit interprétés, sinon non) alors il y a des *chances* que ton site ne contienne pas de failles trop visibles. D'autres questions ? PS : la seule chose a savoir, c'est les risques possibles, si tu as lu les articles de phpsecure.info c'est deja un bon début, apres c'est a toi de te renseigner periodiquement sur la sécurité, car on peut, demain, trouver un type de faille inconnu jusqu'alors qui te demandera des controles supplémentaires sur ton site.
__________________
PHP : Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production) Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error()); Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable. Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/ |
|
|
|
00
|
|
|
#14 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Bon, d'abord un grand merci pour cette réponse complète de Fladnag et l'attention d'Eusébius.
La question était en fait plus simple : Pour sécuriser correctement une requête, on fait : ou Avec bien sûr dans les deux cas auparavant mysql_real_escape_string() . Normalement c'est la première solution. |
|
|
00
|
|
|
#15 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
Citation:
Si tu n'est pas capable de répondre TOI MEME a ta question avec mon précédent message, je crois que tu devrais laisser la sécurité de ton site entre d'autres mains ;o)
__________________
PHP : Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production) Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error()); Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable. Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/ |
|
|
|
00
|
|
|
#16 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Mais qui a donné 5 étoiles à ce sujet ?!
|
|
|
00
|
|
|
#17 | ||
|
Membre extrêmement actif
![]() Inscription : juin 2006 Messages : 1 804 ![]() |
Bonjour,
J'ai testé sur certains de mes inputs de formulaire avec et il me met une erreur de requête ce qui veut dire si j'ai bien compris ce poste , que je ne suis pas sécurisé et qu'il y a des failles. Cela ne m'arrive que sur les formulaire de recherche de données, j'en ai peu heureusement. Pour contrôlé, j'ai fait ceci : Code :
__________________
Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose. |
||
|
|
00
|
|
|
#18 |
|
Membre extrêmement actif
![]() Inscription : juin 2006 Messages : 1 804 ![]() |
Sur les écrans de saisie, j'ai bien un contrôle identique, mais sur cetains champs le retour est bizard, je vois sur le formulaire apparaître du code après la saisie de la phrase magique "a'a"a/a\a<b>a</b>a<br>a$a"
comme ceci : Code :
a$a" size="50" onfocus="this.className='focus';" onblur="this.className='normal';" alt=" nom : Authorité de délivrance ; test : ; obligatoire:true">
__________________
Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose. |
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
c'est parce que tes attributs "value" des input ne sont pas entourés de "" ou de '' ou que tu n'applique pas htmlentities sur la valeur récupérée pour la réafficher.
Le meilleur moyen pour diagnostiquer ca est en effet de regarder le source HTML produit par PHP... le probleme devrait alors te sauter aux yeux (surtout si tu as un colorateur de source comme sous firefox) pour tes erreurs SQL, c'est parce que tu ne fait pas mysql_real_escape_string sur la valeur sans doute. Ou alors que tu ne fait aucune verification de taille par rapport aux champs de la base, dans tout les cas, y a des choses qui manquent en effet ;o)
__________________
PHP : Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production) Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error()); Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable. Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/ |
|
|
00
|
|
|
#20 | |
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 982 ![]() |
Citation:
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com