Bei der Integration von Benutzereingaben in SQL-Abfragen ohne entsprechende Vorsichtsmaßnahmen besteht eine Anfälligkeit des Codes für SQL-Injection. Betrachten Sie das folgende anfällige Code-Snippet:
$unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Dieses Szenario kann über eine Benutzereingabezeichenfolge, z. B. value'); ausgenutzt werden. DROP TABLE-Tabelle;--, was zu einer böswilligen Abfrage führt:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Um solche Angriffe abzuwehren, ist es unbedingt erforderlich, Daten von SQL zu trennen und sicherzustellen, dass Daten als Daten behandelt werden und vom SQL-Parser nicht als Befehl interpretiert werden. Vorbereitete Anweisungen mit parametrisierten Abfragen bieten eine robuste Lösung, indem sie die SQL-Anweisungs- und Parameterwerte trennen. Der Datenbankserver analysiert und kompiliert die SQL-Anweisung, behandelt Parameter als Zeichenfolgen und blockiert effektiv böswillige SQL-Injection-Versuche.
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute([ 'name' => $name ]); foreach ($stmt as $row) { // Do something with $row }
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]); while ($row = $result->fetch_assoc()) { // Do something with $row }
$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string' $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Do something with $row }
Standardmäßig verwendet PDO emulierte vorbereitete Anweisungen. Um die Emulation zu deaktivieren und echte vorbereitete Anweisungen für MySQL zu erzwingen, legen Sie fest:
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Ähnlich stellen Sie Folgendes ein:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // error reporting $dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test'); $dbConnection->set_charset('utf8mb4'); // charset
Vorbereitete Anweisungen werden bei der Ausführung vom Datenbankserver analysiert und kompiliert. Parameter informieren die Datenbank-Engine darüber, wo Filter angewendet werden sollen. Beim Ausführen der vorbereiteten Anweisung mit Werten wird die kompilierte Anweisung mit diesen Werten kombiniert, nicht mit einer SQL-Zeichenfolge. Dies verhindert das Einschleusen schädlicher Zeichenfolgen, die zu einer unbeabsichtigten SQL-Ausführung führen könnten.
Vorbereitete Anweisungen sind nicht für dynamische Abfragen geeignet, bei denen die Abfragestruktur geändert wird. In solchen Fällen sollte ein Whitelist-Filter eingesetzt werden, der mögliche Werte einschränkt.
Das obige ist der detaillierte Inhalt vonWie können vorbereitete Anweisungen die SQL-Injection in PHP verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!