Question

Cela peut être une question stupide. Ou peut-être mes compétences sont limitées hacking (je ne les pratique pas du tout).

J'ai une question qui ressemble à ceci:

<?php
$query =<<<eot
    SELECT      table_x.field1,
                table_x.field2,
                table_y.*,
                table_z.field4
    FROM        (
                    SELECT ...
                ) as table_y
    LEFT JOIN   table_x
    ON          table_x.field1 = table_y.field_x
    LEFT JOIN   table_z
    ON          table_z.field1 = table_y.field_z
    WHERE       table_x.field3 = '$something'
    AND         table_z.field4 = '1'
    AND         table_z.field5 = '2'
eot;
?>

J'ai beaucoup d'autres tests sur $something avant qu'il ne soit utilisé, comme $something = explode(' ',$something); (ce qui entraîne plus tard dans une chaîne) aucun d'entre eux l'intention d'empêcher l'injection, mais ils font qu'il est difficile pour l'injection donnée pour obtenir tout comme la réelle requete. Cependant, il existe des moyens. Nous savons tous combien il est facile de remplacer un espace pour autre chose qui est toujours valide ..

Alors, ce n'est pas vraiment un problème pour faire un morceau potentiellement dangereux de portée SQL de $something ... Mais est-il possible de commenter le reste de la chaîne de requête originale si elle est à plusieurs lignes?

Je ne peux commenter AND table_z.field4 = '1' en utilisant ;-- mais ne peut pas commenter le AND table_z.field5 = '2' suivant

Est-il possible d'ouvrir un /* commentaire multi-ligne sans la fermer ou quelque chose ressemblait, et donc permettre l'injection d'ignorer la requête sur plusieurs lignes?

Était-ce utile?

La solution

Il est pas sûr. Même si elle ne peut pas commenter le reste, il pourrait préfixer avec SELECT * FROM my_table 1 = 1.

Autres conseils

$something = "'; DROP TABLE table_x; SELECT * FROM table_z WHERE '1' = '1";

Utilisez préparé des déclarations pour être sûr:

http://www.php.net/manual/en/pdo .prepare.php

interpolation chaîne a toujours le risque d'injection de code si votre entrée est pas suffisamment nettoyée.

Suppression de la possibilité d'exécuter du code arbitraire est la façon plus facile et beaucoup plus sûr.

@Techpriester:. Ce n'est pas quelle déclaration préparée est

http://dev.mysql.com/tech -RESSOURCES / articles / 4.1 / préparé-statements.html (ancienne version, la même chose)

AOP est une couche d'abstraction de base de données « prépare des déclarations », mais une déclaration préparée est quelque chose de tout à fait différent!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top