injiziert Wenn die Benutzereingabe nicht korrekt verarbeitet wird und sie in die SQL -Abfrage einfügt, werden SQL -Injektionsanfälligkeiten erzeugt. Um dieses Risiko zu verstehen, betrachten Sie bitte das folgende Beispiel:
In dieser Szene wird die Abfrage:
<code class="language-php">$unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");</code>
böswillig eingibt: value'); DROP TABLE table;--
<code class="language-sql">INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')</code>
Technologie entlasten:
Unabhängig davon, in welcher Datenbank die empfohlene Sicherheitspraxis von SQL injiziert wird, besteht darin, Daten von SQL zu trennen. Dies bedeutet, dass Daten als Daten betrachtet werden und niemals von SQL Parser als Befehl interpretiert werden. Der effektivste Weg, um dieses Ziel zu erreichen, besteht darin, Vorbereitungsanweisungen und parametrisierte Abfragen zu verwenden.
Vorverarbeitungsanweisung und Parametrisierungsabfrage:
Vorbereitungsanweisungen umfasst das Senden von SQL -Abfragen und -Parametern an den Datenbankserver, sodass die Datenbank ihre Kombination verarbeiten kann. Dies stellt sicher, dass die Daten vor der Übertragung nicht zur Verhinderung einer schädlichen SQL -Injektion verhindern werden.
Implementierungsoptionen:
Es gibt zwei Hauptmethoden zum Erreichen von Aussagen vor der Verarbeitung:
<code class="language-php">$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute([ 'name' => $name ]); foreach ($stmt as $row) { // 处理行 }</code>
für PHP 8.1 und unterhalb der Versionen:
execute_query()
<code class="language-php">$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]); while ($row = $result->fetch_assoc()) { // 处理行 }</code>
und
von PostgreSQL.<code class="language-php">$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); // 's' 表示'字符串'变量类型 $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // 处理行 }</code>
pg_prepare()
Bei der Herstellung einer Verbindung ist es wichtig, die Simulation von vorverarbeiteten Sätzen zu deaktivieren, um Leistung und Sicherheit zu verbessern. pg_execute()
Schlussfolgerung:
<code class="language-php">$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);</code>
Das obige ist der detaillierte Inhalt vonWie können erstellte Anweisungen und parametrisierte Abfragen die SQL -Injektion in PHP verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!