Heim > Backend-Entwicklung > PHP-Tutorial > Wie kann man SQL-Injection in PHP-Anwendungen wirksam verhindern?

Wie kann man SQL-Injection in PHP-Anwendungen wirksam verhindern?

Linda Hamilton
Freigeben: 2024-12-30 06:36:10
Original
415 Leute haben es durchsucht

How to Effectively Prevent SQL Injection in PHP Applications?

So verhindern Sie SQL-Injection in PHP

Das direkte Einfügen von Benutzereingaben in eine SQL-Abfrage ohne Änderungen macht eine Anwendung anfällig für SQL-Injection-Angriffe. Um dies zu verhindern, ist es wichtig, Daten von SQL zu trennen, um sicherzustellen, dass Daten als Daten bleiben und vom SQL-Parser niemals als Befehle interpretiert werden.

Die effektivste Lösung

Der empfohlene Ansatz zur Vermeidung von SQL-Injection-Angriffen ist unabhängig von der verwendeten Datenbank die Verwendung von vorbereiteten Anweisungen und parametrisierte Abfragen. Hierbei handelt es sich um SQL-Anweisungen, die vom Datenbankserver zusammen mit den Parametern unabhängig analysiert werden. Dieser Ansatz macht es Angreifern unmöglich, bösartiges SQL einzuschleusen.

Implementierung mit PDO oder MySQLi

PDO bietet eine universelle Lösung für alle unterstützten Datenbanktreiber, während MySQLi spezifisch ist zu MySQL.

Mit 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

Mit MySQLi (PHP 8.2 mitexecute_query())

$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);

while ($row = $result->fetch_assoc()) {
    // Do something with $row
}
Nach dem Login kopieren

Verwendung von MySQLi (PHP 8.1 und früher)

$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies string type
$stmt->execute();
$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    // Do something with $row
}
Nach dem Login kopieren

Korrekter Verbindungsaufbau

Bei Verwendung von PDO Stellen Sie bei MySQL durch Deaktivieren sicher, dass echte vorbereitete Anweisungen verwendet werden Emulation.

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

Verwenden Sie für MySQLi Folgendes:

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

Erklärung

Vorbereitete Anweisungen werden vom Datenbankserver analysiert und kompiliert , wodurch die SQL-Anweisung von den Parametern getrennt wird. Wenn die Parameter übergeben werden, werden sie als Zeichenfolgen mit der kompilierten Anweisung kombiniert, wodurch das Risiko einer SQL-Injection ausgeschlossen wird.

Dynamische Abfragen

Vorbereitete Anweisungen können für verwendet werden Parameter in dynamischen Abfragen, die dynamische Abfragestruktur selbst kann nicht parametrisiert werden. In diesen Fällen empfiehlt sich der Einsatz eines Whitelist-Filters.

Das obige ist der detaillierte Inhalt vonWie kann man SQL-Injection in PHP-Anwendungen wirksam 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