SQL-Injections in PHP verhindern
Wenn die Benutzereingabe ungeprüft in die SQL-Abfrage eingefügt wird, wird die Anwendung anfällig für SQL-Injection-Angriffe, wie im folgenden Beispiel:$variable = $_POST['input_utilisateur'];In diesem Beispiel kann der Benutzer eingeben Wert"); DROP TABLE tabelle;--') . Die Abfrage lautet:
mysql_query("INSERT INTO 'table' ('column') VALUES ('$variable')");
mysql_query("INSERT INTO 'table' ('column') VALUES('value'); DROP TABLE table;--')
Das Ziel des Hackers ist es, die SQL-Abfrage so zu modifizieren, dass er versteckte Informationen lesen oder eine andere Operation ausführen kann (Lesen, Ändern, Löschen). In diesem Beispiel wird die Tabelle aus der Datenbank entfernt.
Diese Art von Fehler ist die am weitesten verbreitete und gefährlichste, und wenn Ihr Code nicht sicher ist, wäre das Risiko enorm.
Die Lösung für SQL-Injection-Fehler besteht darin, vorbereitete Abfragen oder parametrisierte Abfragen zu verwenden. Zur Vorbereitung der Ausführung wird die Abfrage an den Datenbankserver gesendet und führt eine Syntaxprüfung durch. Mit dieser Methode ist es für den Hacker unmöglich, bösartiges SQL einzuschleusen.
Dazu haben Sie drei Möglichkeiten:
1- Verwenden des PDO:
$statement = $pdo-> prepare('SELECT * FROM administrator WHERE name = :name');2- Verwenden von MySQLi:
$statement-> execute(array('name' => $nom));
foreach ($statement wie $row) {
// etwas tun
}
$statement = $dbConnection-> prepare('SELECT * FROM administrator WHERE name = ?');3- Mit der Methode PHP mysql_real_escape_string
$statement-> bind_param('s', $nom);
$statement-> execute();
$result = $statement-> get_result();
while ($row = $result-> fetch_assoc()) {
// etwas tun
}
PHP hat eine eigene Methode, um diese Schwachstelle zu beheben, aber es sollte beachtet werden, dass die beiden vorherigen Methoden effektiver sind. mysql_real_escape_string nimmt eine Zeichenfolge, die in der MySQL-Abfrage verwendet wird, und gibt dieselbe Zeichenkette zurück, die von jeder SQL-Injection maskiert wurde. Die quotas(') werden durch \' ersetzt. Diese Funktion setzt voraus, dass Sie bereits mit der Datenbank verbunden sind, um sie verwenden zu können.
$nom = "' OR 1'";
$nom = mysql_real_escape_string($nom);
$query = "SELECT * FROM administrator WHERE name = '$nom'";
echo "Injektion vermieden: < br />" . $query . "< br />";
$name_vul = "'; DELETE FROM administrator WHERE 1 or name = '";
$name_vul = mysql_real_escape_string($name_vul);
$query_vul = "SELECT * FROM administrator WHERE name = '$nom'";
echo "Injektion vermieden: < br />" . $query_vul;
Referenzen:
https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php