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']; 

mysql_query("INSERT INTO 'table' ('column') VALUES ('$variable')");
In diesem Beispiel kann der Benutzer eingeben  Wert"); DROP TABLE tabelle;--') . Die Abfrage lautet:

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'); 

$statement-> execute(array('name' => $nom));

foreach ($statement wie $row) {
// etwas tun
}
2- Verwenden von MySQLi:

$statement = $dbConnection-> prepare('SELECT * FROM administrator WHERE name = ?'); 
$statement-> bind_param('s', $nom);

$statement-> execute();

$result = $statement-> get_result();
while ($row = $result-> fetch_assoc()) {
// etwas tun
}
3- Mit der Methode PHP mysql_real_escape_string
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