Heim >Backend-Entwicklung >PHP-Tutorial >Wie können vorbereitete Anweisungen die SQL-Injection in PHP verhindern?

Wie können vorbereitete Anweisungen die SQL-Injection in PHP verhindern?

Susan Sarandon
Susan SarandonOriginal
2025-01-01 09:08:11415Durchsuche

How Can Prepared Statements Prevent SQL Injection in PHP?

Schutz vor SQL-Injection in PHP

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

Präventionsstrategien

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.

Implementierung vorbereiteter Anweisungen

PDO

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);

foreach ($stmt as $row) {
    // Do something with $row
}

MySQLi für MySQL (PHP 8.2)

$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
    // Do something with $row
}

MySQLi für MySQL (bis zu PHP 8.1)

$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
}

Zusätzliche Vorsichtsmaßnahmen für PDO und MySQLi

PDO

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

MySQLi

Ä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

Grundlegende vorbereitete Anweisungen

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.

Vorbehalte

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn