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
Freigeben: 2025-01-01 09:08:11
Original
405 Leute haben es durchsucht

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')");
Nach dem Login kopieren

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;--')
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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);
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage