/ / SQL Injection Protection - einfache Anführungszeichen [Duplizieren] - php, mysql, sql-injection

SQL Injection Protection - einfache Anführungszeichen [Duplizieren] - php, mysql, sql-injection

Mögliche Duplikate:
Der beste Weg, um SQL-Injection in PHP zu verhindern?

Ich habe ein bisschen getestet, um meine zu schützenWebsites von SQL Injection. Ich sehe, es gibt ein paar Möglichkeiten, dies zu tun, entgehen meine Benutzereingaben, Hinzufügen von Schrägstrichen, oder besser noch mit parametrisierten SQL-Anweisungen.

Ich hatte diesen Testcode ..

$q=$_GET["q"];
$game = mysql_query("SELECT * FROM `Games` WHERE `id` = "$q"");
$game = mysql_fetch_array($game);

echo "<h4>ID: ".$game[0]."<br /></h4>name: " . $game[1];

Und ich habe mehrere SQLi-Anfragen ausprobiert und konnte meine Testseite nicht auf Fehler setzen oder zusätzliche Daten anzeigen.

Aber wenn ich meinen sql-Anweisungscode zu diesem änderte (entfernte die Anführungszeichen um $ q).

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = $q");

Ich könnte einfache SQL-Befehle ausführen und einige Ergebnisse erhalten.

Ist es also gut genug, meine Benutzereingaben in einfache Anführungszeichen zu schreiben? Oder habe ich über komplexere SQLi-Techniken ausgesehen?

Antworten:

1 für die Antwort № 1

Probieren Sie diese Eingabe aus:

abc" OR id <> "

es wird zur folgenden Behauptung führen:

"SELECT * FROM `Games` WHERE `id` = "abc" OR id <> """

Das würde alle Spiele statt nur eines zurückgeben. Wenn Ihre Seite erlaubt, das ganze Ergebnis zu zeigen, dann würden wir definitiv zu viel sehen ...

Der Ausweg ist, PDO mit vorbereiteten Aussagen zu verwenden, sind zumindest die mysqli_real_escape_string() Funktion vor dem Einfügen der Benutzereingabe in die SQL-Anweisung.

SQL-Injection kann viel mehr, im schlimmsten Fall sogar die Kontrolle über den Server. Schau dir das an SQL Injection Spickzettel


3 für die Antwort № 2

Sie erwähnen SQL Injection und parametrisierte Anweisungen, scheint aber nicht PDO zu sein? - Verwenden Sie PDO http://www.php.net/manual/en/pdo.prepare.php


0 für die Antwort № 3

du solltest benutzen mysql_real_escape_string() Funktion

In diesem Fall müssen Sie die einfachen Anführungszeichen verwenden

 $game = mysql_query("SELECT * FROM `Games` WHERE `id` = "$q"");

Nehmen wir an, Benutzereingabe ist 1" als die escape_string-Ausgabe wird sein 1"

Wenn Sie keine Anführungszeichen verwenden, wird die Abfrage ausgeführt

SELECT * FROM `Games` WHERE `id` = 1"

//that is wrong or a injection

Aber im Fall der einfachen Anführungszeichen

SELECT * FROM `Games` WHERE `id` = "1""

das ist gut und kann das entfernen sql-injection