Heim >Backend-Entwicklung >PHP-Tutorial >Wie können vorbereitete Anweisungen SQL-Injection-Angriffe in PHP-Anwendungen verhindern?
SQL-Injection-Angriffe in PHP verhindern
In Webanwendungen können Benutzereingaben oft zu Schwachstellen wie SQL-Injection führen, wenn sie nicht behandelt werden richtig. SQL-Injection tritt auf, wenn vom Benutzer bereitgestellte Daten ohne ordnungsgemäße Validierung oder Bereinigung direkt in SQL-Anweisungen enthalten sind.
Das Problem
Bedenken Sie den folgenden PHP-Codeausschnitt:
$unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Wenn ein Benutzer bösartige Daten wie einen Wert eingibt'); DROP TABLE-Tabelle;--, die SQL-Abfrage lautet:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Dies würde dazu führen, dass der böswillige Benutzer die gesamte Tabelle aus der Datenbank löscht.
Lösung: Vorbereitete Anweisungen und Parametrisierung
Die empfohlene Lösung zur Verhinderung von SQL-Injections besteht darin, Daten von SQL zu trennen, indem vorbereitete Anweisungen und parametrisierte Abfragen verwendet werden. Dadurch wird sichergestellt, dass Benutzereingaben als Daten und nicht als ausführbare Befehle behandelt werden.
Verwendung von PDO
PDO bietet eine konsistente und universelle Schnittstelle zu verschiedenen Datenbanktreibern. So verwenden Sie vorbereitete Anweisungen mit PDO:
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(['name' => $name]); foreach ($stmt as $row) { // Do something with $row }
Verwendung von MySQLi
Speziell für MySQL bietet MySQLi die Methodeexecute_query() in PHP 8.2:
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]); while ($row = $result->fetch_assoc()) { // Do something with $row }
Oder in PHP-Versionen vor 8.2:
$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); // 's' specifies the variable type as string $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Do something with $row }
Für Weitere Informationen zu anderen Datenbanktreibern finden Sie in der entsprechenden Dokumentation.
Korrekte Verbindungseinrichtung
Um echten Schutz zu gewährleisten, ist es wichtig, die Datenbankverbindung richtig zu konfigurieren:
PDO
Emuliert vorbereitet deaktivieren Anweisungen:
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
MySQLi
Fehlermeldung aktivieren und Zeichensatz festlegen:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test'); $dbConnection->set_charset('utf8mb4');
Erklärung
Vorbereitete Anweisungen werden vom Datenbankserver analysiert und kompiliert, während Parameter als separate Werte behandelt werden. Dadurch wird verhindert, dass böswillige Eingaben als Befehle interpretiert werden.
Fazit
Durch den Einsatz vorbereiteter Anweisungen und Parametrisierung können Sie Ihre PHP-Webanwendungen effektiv vor SQL-Injection-Angriffen schützen und warten Datenintegrität.
Das obige ist der detaillierte Inhalt vonWie können vorbereitete Anweisungen SQL-Injection-Angriffe in PHP-Anwendungen verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!