Heim > Artikel > Backend-Entwicklung > Was ist der Zweck von addslashes() und wie kann man die MySQL-Injection in PHP verhindern?
1. Formulardaten
zeigt die Formulardaten an
Die erfassten Formulardaten von 2.php
wurden automatisch hinzugefügt
3.MySQL-Daten (unterste Zeile)
werden in MySQL geschrieben, aber es gibt kein
4. Ich vermute, dass es von der MySQL-Software ausgeblendet wird:
Ich habe es auch nicht gesehen
Laut offizieller Stellungnahme
http://www.php.net/manual/zh/function.addslashes.php
Ein Beispiel für die Verwendung von addslashes() ist die Eingabe von Daten in eine Datenbank. Wenn Sie beispielsweise den Namen O'reilly in die Datenbank einfügen möchten, müssen Sie ihn maskieren. Es wird dringend empfohlen, die DBMS-spezifische Escape-Funktion zu verwenden (z. B. mysqli_real_escape_string() für MySQL, pg_escape_string() für PostgreSQL). Wenn das von Ihnen verwendete DBMS jedoch keine Escape-Funktion hat und Sonderzeichen mit Escapezeichen maskiert, können Sie dies tun Nutzen Sie diese Funktion. Nur um die Daten in die Datenbank einzufügen, werden keine weiteren Daten eingefügt. Wenn die PHP-Direktive magic_quotes_sybase auf „on“ gesetzt ist, bedeutet dies, dass das Einfügen von „ mit „ maskiert wird.
Frage:
1. Welchen Mechanismus verwendet die Funktion „addsleshes()“, um die Injektion zu verhindern?
Unter welchen Umständen wird „stripslashes()“ verwendet?
3 Wäre es besser, wenn die übermittelten Daten direkt mit htmlspecialchars() maskiert und in der Datenbank gespeichert würden?
4. Was ist der beste Weg, um SQL-Injection zu verhindern?
.
1. Formulardaten
zeigt die Formulardaten an
Die erfassten Formulardaten von 2.php
wurden automatisch hinzugefügt
3.MySQL-Daten (unterste Zeile)
werden in MySQL geschrieben, aber es gibt kein
4. Ich vermute, dass es von der MySQL-Software ausgeblendet wird:
Ich habe es auch nicht gesehen
Laut offizieller Stellungnahme
http://www.php.net/manual/zh/function.addslashes.php
Ein Beispiel für die Verwendung von addslashes() ist die Eingabe von Daten in eine Datenbank. Wenn Sie beispielsweise den Namen O'reilly in die Datenbank einfügen möchten, müssen Sie ihn maskieren. Es wird dringend empfohlen, die DBMS-spezifische Escape-Funktion zu verwenden (z. B. mysqli_real_escape_string() für MySQL, pg_escape_string() für PostgreSQL). Wenn das von Ihnen verwendete DBMS jedoch keine Escape-Funktion hat und Sonderzeichen mit Escapezeichen maskiert, können Sie dies tun Nutzen Sie diese Funktion. Nur um die Daten in die Datenbank einzufügen, werden keine weiteren Daten eingefügt. Wenn die PHP-Direktive magic_quotes_sybase auf „on“ gesetzt ist, bedeutet dies, dass das Einfügen von „ mit „ maskiert wird.
Frage:
1. Welchen Mechanismus verwendet die Funktion „addsleshes()“, um die Injektion zu verhindern?
Unter welchen Umständen wird „stripslashes()“ verwendet?
3 Wäre es besser, wenn die übermittelten Daten direkt mit htmlspecialchars() maskiert und in der Datenbank gespeichert würden?
4. Was ist der beste Weg, um SQL-Injection zu verhindern?
.
Wie im Dokument geschrieben, fügt addslashes
lediglich einen Schrägstrich vor den Anführungszeichen des Parameters hinzu.
Wie bei den von Ihnen gedruckten Daten steht auch hier ein Schrägstrich vor dem Parameter.
Aber es sollten keine Schrägstriche in der Datenbank vorhanden sein! Wie addslashes
die Injektion verhindert, besteht darin, die direkte Anwendung von Eingabeparametern zu verhindern, wenn wir SQL
schreiben, was zur Erzeugung von SQL
führt, das injiziert werden kann, um die Injektion zu verhindern.
Zum Beispiel $sql = "SELECT * FROM user WHERE id = '$id'";
, wenn der $id
-Parameter hier absichtlich in 1' OR '1 = 1'
manipuliert wird, wäre es dann nicht eine Injektion von SQL
?
Und wenn Sie addslashes
mit einem Schrägstrich verwenden, werden die Anführungszeichen in $id
übersetzt und das falsche SQL
wird nicht generiert. Diese Ergebnisse wirken sich jedoch nicht auf das Schreiben von Daten aus, da diese Schrägstriche zurückübersetzt werden, wenn Daten tatsächlich eingefügt und aktualisiert werden.
SQL-Injection verhindern (Eingabedatenbank):
PDO bindParam oder mysqli_stmt_bind_param: SQL-Injection vermeiden.
Addslashes: Verwenden Sie Backslashes, um alle einfachen Anführungszeichen, doppelten Anführungszeichen, Backslashes und NULs zu maskieren, bis zu einem gewissen Grad, um SQL zu vermeiden Injektion.
mysqli_real_escape_string: Escape-Sonderzeichen in SQL-Anweisungen.
Mit bind_param müssen keine Addslashes, mysqli_real_escape_string, magic_quotes_gpc verwendet werden.
Zum Beispiel:
<code>PDO MySQL: //方法1(问号占位符) $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'); $stmt->execute(array($title,$content,$id)); //所有值视作PDO::PARAM_STR处理 //方法2(命名占位符) $stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id'); $stmt->execute(array(':title' => $title,':content' => $content,':id' => $id)); //所有值视作PDO::PARAM_STR处理 //方法3 $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'); $stmt->bindParam(1, $title, PDO::PARAM_STR); $stmt->bindParam(2, $content, PDO::PARAM_STR); $stmt->bindParam(3, $id, PDO::PARAM_INT); $stmt->execute(); //方法4 $stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id'); $stmt->bindParam(':title', $title, PDO::PARAM_STR); $stmt->bindParam(':content', $content, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); MySQLi: //MySQLi只需执行一次bind_param,要比PDO简洁一些,MySQLi不支持命名占位符. $stmt->bind_param('ssi', $title, $content, $id);</code>
Die von Ihnen erwähnten htmlspecialchars dienen der Abwehr von XSS-Angriffen bei der Ausgabe von HTML, was sich von der oben erwähnten Verteidigung gegen SQL-Injection unterscheidet