Heim >Datenbank >MySQL-Tutorial >Beispiele für SQL-Injection und wie man SQL-Injection verhindert
Bei der SQL-Injection wird die externe Schnittstelle einiger Datenbanken verwendet, um Benutzerdaten in die eigentliche Sprache des Datenbankbetriebs einzufügen. Um den Zweck zu erreichen, in die Datenbank und sogar in das Betriebssystem einzudringen. Im Bereich Sicherheit, 我们永远不要信任用户的输入
müssen wir feststellen, dass die vom Benutzer eingegebenen Daten nicht sicher sind, und wir alle müssen die vom Benutzer eingegebenen Daten filtern. 没有(运行时)编译,就没有注入。
Der Weg, die oben genannten Arten von Angriffen grundsätzlich zu verhindern, besteht also darin, zu verhindern, dass Daten in Code umgewandelt und ausgeführt werden, und immer die Grenzen zwischen Code und Daten zu unterscheiden. Was speziell die SQL-Injection betrifft, wird der ausgeführte Schadcode über die SQL-Interpretations-Engine der Datenbank kompiliert, sodass lediglich verhindert werden muss, dass die vom Benutzer eingegebenen Daten vom Datenbanksystem kompiliert werden.
Im Gegensatz zu anderen Datenbanken kann MySQL in verschiedenen SQL-Modi (SQL-Server-Modus) ausgeführt werden und verschiedene Modi auf verschiedene Clients anwenden. Auf diese Weise kann jede Anwendung den Betriebsmodus des Servers an ihre eigenen Bedürfnisse anpassen. Das Schema definiert, welche SQL-Syntax MySQL unterstützen soll und welche Art von Datenvalidierungsprüfungen durchgeführt werden sollen. Dies ähnelt in gewisser Weise der Konfiguration verschiedener Ebenen von Fehlerprotokollen durch Apache, welche Fehler gemeldet werden und welche nicht.
//php代码 $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('{$unsafe_variable}')");
Wenn der Code im Beitrag wie folgt lautet:
value'); DROP TABLE table;--
Abfrage--Code wird zu
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Dadurch wird die -Tabelle direkt gelöscht und Ihre Daten werden vernichtet.
2. SQL-Injection verhindernMethode 1 prepareStatement+Bind-Variable: SQL-Anweisungen und Abfrageparameter werden jeweils zum Parsen an den Datenbankserver gesendet.
Es gibt zwei Implementierungsmethoden für PHP.
//使用PDO(PHP data object) $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something with $row } //使用mysql扩展-mysqli $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row }
Methode 2 Escape der Abfrageanweisung (die häufigste Methode): Verwenden Sie die von der Anwendung bereitgestellte Konvertierungsfunktion
. |Anwendung|Funktion|
|--------| |MySQL C API | mysql_real_escape_string ()| |MySQL++|escape和quote修饰符| |PHP|使用mysql_real_escape_string()(适用于PHP4.3.0以前),之后可以使用mysqli或pdo| | Perl DBI|placeholder或quote()| |Ruby DBI|placeholder或quote()|Methode 3
Verwenden Sie Ihre eigene definierte Funktion
zur Überprüfung: Es handelt sich im Wesentlichen immer noch um Enter illegale Daten zum Entkommen und Filtern. Die Eingabevalidierung kann unterteilt werden in: 1. Daten organisieren, um sie gültig zu machen; 2. Bekannte illegale Eingaben ablehnen; 3. Nur bekanntermaßen legale Eingaben akzeptieren;
Gespeicherte Prozedur verwenden
. Informationen zu gespeicherten Prozeduren finden Sie unter: (9) Gespeicherte Prozeduren und benutzerdefinierte Funktionen in MySQL
#查看当前sql模式 select @@sql_mode; #查看当前sql模式 SELECT @@session.sql_mode; #修改当前sql模式 SET [SESSION][GLOBAL] sql_mode='modes';
eingestellt werden. 2.sql_mode allgemeine Werte
ONLY_FULL_GROUP_BY:Für den Vorgang GROUP BYAggregation
wird angezeigt, wenn die Spalte in SELECT nicht in GROUP ist in BY ist diese SQL ungültig, da die Spalte nicht in der GROUP BY-Klausel enthalten ist.
Dieser Wert beeinflusst das Einfügen automatisch vergrößernder Spalten. Unter den Standardeinstellungen bedeutet das Einfügen von 0 oder NULL, dass der nächste automatisch steigende Wert generiert wird. Diese Option ist nützlich, wenn der Benutzer einen Wert von 0 einfügen möchte und die Spalte automatisch vergrößert wird.
Wenn in diesem Modus ein Wert nicht in eine Transaktionstabelle eingefügt werden kann, wird der aktuelle Vorgang unterbrochen und es gibt keine Begrenzung für Nicht-Transaktionstabellen .
Im strengen Modus sind null Tage und Monate nicht zulässig.
Legen Sie diesen Wert fest. Die MySQL-Datenbank erlaubt das Einfügen von Nulldaten nicht und das Einfügen von Nulldaten löst einen Fehler anstelle einer Warnung aus.
Während INSERT oder UPDATE wird ein Fehler anstelle einer Warnung generiert, wenn Daten durch Null geteilt werden. Wenn der Modus nicht angegeben ist, gibt MySQL NULL zurück, wenn die Daten durch Null geteilt werden.
Verhindert, dass GRANT Benutzer mit leeren Passwörtern erstellt.
Wirft einen Fehler aus, wenn die erforderliche Speicher-Engine deaktiviert oder nicht kompiliert ist. Wenn dieser Wert nicht festgelegt ist, wird stattdessen die Standardspeicher-Engine verwendet und eine Ausnahme ausgelöst.
PIPES_AS_CONCAT:
behandelt „||“ als Verkettung Operator von String anstelle von oder Operator , was der ist Identisch mit der Oracle-Datenbank und ähnelt der Zeichenfolgenverkettungsfunktion Concat.
ANSI_QUOTES:
Wenn ANSI_QUOTES aktiviert ist, können Sie eine -Zeichenfolge nicht in doppelte Anführungszeichen setzen, da sie als Bezeichner interpretiert wird.
Erklärung
Die sql_mode-Einstellung von ORACLE entspricht: PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.
[Verwandte Empfehlungen]
1. Kostenloses MySQL-Online-Video-Tutorial
2. Neuestes MySQL-Handbuch-Tutorial
3. Boolean Education Yan Shiba MySQL-Einführungsvideo-Tutorial
Das obige ist der detaillierte Inhalt vonBeispiele für SQL-Injection und wie man SQL-Injection verhindert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!