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

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

DDD
DDDOriginal
2024-12-21 16:46:10634Durchsuche

How Can Prepared Statements Prevent SQL Injection Attacks in PHP Applications?

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!

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