/ / PHP: Comprendre l'injection SQL - php, mysql, sql-injection

PHP: comprendre l'injection SQL - php, mysql, sql-injection

Je travaille sur un ancien site Web et j’ai trouvé cette erreur dans les fichiers journaux:

 Invalid SQL: SELECT COUNT(*) AS color_count FROM colors WHERE id IN (on,on) ;

mysql error: You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near
"on,on) " at line 1

Le code php est comme ça:

$query  = "SELECT COUNT(*) AS color_count FROM colors WHERE id IN ";
$ids    = implode("","", $_GET["id_color"]);
$query  .= "("".$ids."") ";

J'ai résolu cette erreur en ajoutant mysql_real_escape_string.

Mais je veux comprendre comment une injection SQL peut modifier la requête et supprimer les guillemets simples " de la requête?

Réponses:

2 pour la réponse № 1

L'injection SQL ne peut ajouter que des caractères, elle ne peut pas supprimer des caractères de votre chaîne SQL. En d'autres termes, ce n'est pas une "aspiration SQL". :-)

Je peux penser à ces possibilités:

  • L'erreur dans le journal s'est produite à une date antérieure, avant la citation de votre code. Peut-être a-t-il été conçu à l’origine pour ne traiter que les entiers, qui ne doivent pas être cités.

    Je recommande de noter la date / heure de l'erreur dans le journal, puis de récupérer la version du code de votre contrôle de code source correspondant à cette date.

  • L'erreur a été générée par une requête SQL similaire dans une autre partie de votre code, le code ne pouvant pas citer les valeurs.

    Je recommande de rechercher dans tout votre code des requêtes SQL similaires.

  • Votre code (ou votre framework) supprime les guillemets simples de la chaîne SQL. Je ne peux pas deviner pourquoi il ferait cela, mais en théorie, c’est une possibilité.


0 pour la réponse № 2

L'injection SQL est un danger (parmi d'autres cas) partout où vous autorisez la saisie directe de l'utilisateur dans l'instruction. C'est pourquoi les déclarations liées sont plus sûres et préférées.

L’essentiel est, si je peux me baser sur une contribution à laÀ la fin de votre déclaration, rien ne m’empêche d’ajouter un point-virgule pour terminer votre déclaration en cours, puis une nouvelle déclaration dans la même variable. Ma chaîne pourrait donc être:

"11; Drop colours existe s'il y a cascade" dans lequel une exécution naïve exécuterait deux instructions, dont l'une se termine comme vous le souhaitez, puis la malveillante qui supprime votre table.

Maintenant, une case à cocher ne sera probablement pas victime d’injection, mais cela devrait toujours être une préoccupation.

Faites quelques recherches supplémentaires sur l'injection SQL et comprenez-le vraiment. Ensuite, vous pouvez commencer à construire et à modifier le code pour mieux le combattre.

http://en.wikipedia.org/wiki/SQL_injection


0 pour la réponse № 3

Ça peut être " or "1"="1 si vous voulez casser des guillemets simples (http://en.wikipedia.org/wiki/SQL_injection).