/ / PHP: SQL Injection verstehen - PHP, MySQL, SQL-Injection

PHP: SQL Injection verstehen - PHP, MySQL, SQL-Injektion

Ich arbeite an einer alten Website und habe diesen Fehler in den Protokolldateien gefunden:

 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

Der Code PHP ist wie folgt:

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

Ich habe diesen Fehler durch Hinzufügen behoben mysql_real_escape_string.

Aber ich möchte verstehen, wie eine SQL-Injection die Abfrage ändern und die einfachen Anführungszeichen entfernen kann " von der Abfrage?

Antworten:

2 für die Antwort № 1

SQL Injection kann nur Zeichen hinzufügen und keine Zeichen aus Ihrer SQL-Zeichenfolge entfernen. Mit anderen Worten, es ist keine SQL-Absaugung :-)

Ich kann mir diese Möglichkeiten vorstellen:

  • Der Fehler im Protokoll ist an einem Datum in der Vergangenheit aufgetreten, bevor Ihr Code in Anführungszeichen gesetzt wurde. Vielleicht wurde es ursprünglich entworfen, um nur Ganzzahlen zu verarbeiten, die nicht in Anführungszeichen gesetzt werden müssen.

    Ich empfehle, das Datum und die Uhrzeit des Fehlers im Protokoll zu notieren und dann die zu diesem Datum gehörige Codeversion aus Ihrer Quellcodeverwaltung abzurufen.

  • Der Fehler wurde durch eine ähnliche SQL-Abfrage in einem anderen Teil Ihres Codes generiert, in dem der Code die Werte nicht in Anführungszeichen setzt.

    Ich empfehle, den gesamten Code nach ähnlichen SQL-Abfragen zu durchsuchen.

  • Ihr Code (oder Ihr Framework) entfernt einfache Anführungszeichen aus der SQL-Zeichenfolge. Ich kann nicht erraten, warum es das tun würde, aber theoretisch ist es eine Möglichkeit.


0 für die Antwort № 2

SQL-Injection ist (unter anderem) überall dort eine Gefahr, wo Benutzereingaben direkt in die Anweisung eingegeben werden können. Aus diesem Grund sind gebundene Aussagen sicherer und werden bevorzugt.

Das Wesentliche dabei ist, ob ich mich an den Inputs orientieren kannAm Ende Ihrer Anweisung hindert mich nichts daran, ein Semikolon hinzuzufügen, um die aktuelle Anweisung zu beenden, und dann eine neue Anweisung in derselben Variablen. Meine Zeichenfolge könnte also sein:

"11; Drop colors if exists cascade", bei der eine naive Ausführung zwei Anweisungen ausführt, von denen eine erwartungsgemäß ausgeführt wird, und die böswillige Anweisung, mit der Ihre Tabelle gelöscht wird.

Nun ist es nicht wahrscheinlich, dass ein Kontrollkästchen Opfer einer Injektion ist, aber es sollte immer ein Problem sein.

Machen Sie weitere Recherchen zu SQL Injection und verstehen Sie es wirklich. Anschließend können Sie Code erstellen und ändern, um ihn besser zu bekämpfen.

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


0 für die Antwort № 3

Es kann sein " or "1"="1 wenn Sie einfache Anführungszeichen brechen möchten (http://en.wikipedia.org/wiki/SQL_injection).