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.
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(['name' => $name]); foreach ($stmt as $row) { // Do something with $row }
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]); while ($row = $result->fetch_assoc()) { // Do something with $row }
$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 }
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);
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
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!