verhindern die SQL -Injektion in php
Wenn die Benutzereingabe nicht korrekt verarbeitet und in eine SQL -Abfrage eingefügt wird, erfolgt eine SQL -Injektionsanfälligkeit. Um dieses Risiko zu verstehen, betrachten Sie das folgende Beispiel:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
In diesem Szenario wird der Benutzer bösartig wie Wert ');
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
mischen Techniken:
Empfohlene Sicherheitspraktiken zur Verhinderung der SQL -Injektion sollen Daten von SQL trennen, unabhängig davon, welche Datenbank Sie verwenden. Dies bedeutet, dass die Daten als Daten behandelt und vom SQL -Parser nie als Befehl interpretiert werden. Die effizienteste Möglichkeit, dies zu erreichen, besteht darin, Vorverarbeitungsanweisungen und parametrisierte Abfragen zu verwenden.
Vorverarbeitungsanweisungen und parametrisierte Abfragen:]
Die Vorverarbeitungsanweisung umfasst das Senden von SQL -Abfragen und Parametern an den Datenbankserver separat, sodass die Datenbank ihre Kombination verarbeiten kann. Dies verhindert böswillige SQL -Injektionsversuche, indem sichergestellt wird, dass die Daten vor der Übertragung nicht von PHP analysiert werden.
Implementierungsoptionen:
Es gibt zwei Hauptmethoden zur Implementierung von Vorverarbeitungsanweisungen:
pdo (Php -Datenobjekt):
Dies ist ein gemeinsamer Ansatz, der mit allen unterstützten Datenbanktreibern zusammenarbeitet. Hier ist ein Beispiel für die Verwendung:
$ stmt = $ pdo-> prepe ('select * von Mitarbeitern wobei Name =: Name'); $ stmt-> execute (['name' => $ name]); foreach ($ stmt als $ row) { // Verarbeitungslinie }
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);
foreach ($stmt as $row) {
// 处理行
}
mysqli (mysql verbesserte Erweiterung): Für MySQL -Datenbanken können Sie MySQLI verwenden. Ab PHP 8.2 können Sie die Methode execute_query () verwenden, um Parameter vorzubereiten, zu binden und SQL -Anweisungen in einem Schritt auszuführen:
$ result = $ db-> execute_query ('select * von Mitarbeitern, wo name =?', [$ name]);
while ($ row = $ result-> fetch_assoc ()) {
// Verarbeitungslinie
}
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
// 处理行
}
$ stmt = $ db-> prepe ('select * von Mitarbeitern, wo name =?');
$ stmt-> bind_param ('s', $ name);
$ stmt-> execute ();
$ result = $ stmt-> get_result ();
while ($ row = $ result-> fetch_assoc ()) {
// Verarbeitungslinie
}
$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()) {
// 处理行
}
pg_prepare () ] von postgresql.
korrekte Verbindungseinstellungen:
Bei der Erstellung einer Verbindung ist es wichtig, die Simulation von Vorverarbeitungsanweisungen für eine verbesserte Leistung und Sicherheit zu deaktivieren.
pdo Connection:
$ dbConnection = new pdo ('mysql: dbname = dbtest; host = 127.0.0.1; charset = utf8mb4', 'user', 'Passwort'); $ dbConnection-> setAttribute (pdo :: attr_emulate_prepares, false); $ dbConnection-> setAttribute (pdo :: attr_errmode, pdo :: errmode_exception);
$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);
mysqli_report (mysqli_report_error | mysqli_report_strict); $ dbConnection = new MySQLI ('127.0.0.1', 'Benutzername', 'Passwort', 'Test'); $ dbConnection-> set_charset ('utf8mb4');
abschließend:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 错误报告
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4'); // 字符集
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3