2010-06-01 17 views
5

Das könnte eine dumme Frage sein. Oder vielleicht sind meine Hacking-Fähigkeiten begrenzt (ich übe sie überhaupt nicht).Sind mehrzeilige Abfragen sql-injection sicher?

Ich habe eine Abfrage, die wie folgt aussieht:

<?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; 
?> 

Ich habe viele andere Tests auf $something, bevor es verwendet wird, wie $something = explode(' ',$something); (die in einem String führen später) keiner von ihnen beabsichtigen, zu verhindern, Injektion, aber sie machen es schwierig für die gegebene Injektion zu erhalten, wie es für die eigentliche Abfrage ist. Allerdings gibt es Wege. Wir alle wissen, wie einfach es ist, einen Platz für etwas anderes, das noch gültig ist, zu ersetzen.

Also ist es nicht wirklich ein Problem, ein potenziell schädliches Stück SQL zu erreichen, dass $something ... Aber es gibt irgendwelche Möglichkeit, den Rest der ursprünglichen Abfragezeichenfolge zu kommentieren, wenn es mehrzeilig ist?

kann ich einen Kommentar AND table_z.field4 = '1';-- verwenden, aber nicht einen kurzen Kommentar zum AND table_z.field5 = '2'

Ist es möglich, /* einen mehrzeiligen Kommentar zu öffnen, ohne sie oder etwas schließen aussah und erlauben daher die Injektion die multi- zu ignorieren Zeilenabfrage?

Antwort

4

Es ist nicht sicher. Auch wenn es den Rest nicht auskommentieren kann, könnte es SELECT * FROM my_table WHERE 1 = 1 vorangestellt werden.

+0

Danke Adam, du hast Recht. Es ist einfach, diese mehrzeilige Abfrage zu hacken. Schade mich, dass ich diese Option nicht gesehen habe. Dies ist jedoch ein Beispiel und meine Situation ist ein wenig komplizierter. Da ich es versäumt habe, mich zu erklären, werde ich deine Antwort als richtig akzeptieren. – acm

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

Verwenden vorbereitete Anweisungen, sicher zu sein:

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

String Interpolation immer hat, ist das Risiko von Code-Injektion, wenn Sie Ihre Eingaben nicht ausreichend gereinigt.

Das Entfernen der Möglichkeit, beliebigen Code auszuführen, ist einfacher und sicherer.

+0

+1 Dies ist wirklich die einzig richtige Antwort. "Reinigen" selbst ist nur so gut wie Ihr Wissen über SQL-Injection. Lassen Sie die Datenbank/das getestete ORM für Sie arbeiten. – richsage

2

@Techpriester: das ist nicht, was eine vorbereitete Aussage ist.

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html (alte Version, die gleiche Sache)

PDO ist eine Datenbank-Abstraktionsschicht, dass „bereitet Aussagen“, sondern eine vorbereitete Erklärung ist etwas ganz anderes!

+1

PDO emuliert vorbereitete Anweisungen standardmäßig, aber Sie können diesen Modus ausschalten '$ pdo-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, false);' Beobachten Sie Ihr allgemeines Abfrageprotokoll von MySQL und sehen Sie, wie es funktioniert! –