Dieser Artikel vermittelt Ihnen relevantes Wissen über MySQL. Er befasst sich hauptsächlich mit der Frage, warum SQL-Parametrierungsabfragen die SQL-Injection verhindern können. Ich hoffe, dass er für alle hilfreich ist.
Warum können SQL-parametrisierte Abfragen SQL-Injection verhindern?
1. Was ist SQL-Injection?
Fügen Sie SQL-Befehle in die Abfragezeichenfolge der Formularübermittlung oder der Eingabe des Domänennamens oder der Seitenanforderung ein und verleiten Sie so den Server zur Ausführung schädlicher SQL-Befehle.
-- 正常的查询语句 select * from users where username = 'a'; -- 恶意的查询语句 select * from users where username = 'a' or 1==1;
2. Was ist eine parametrisierte Abfrage?
Parameterisierte Abfrage bedeutet, dass beim Abfragen der Datenbank Parameter verwendet werden, um Werte anzugeben, bei denen Daten ausgefüllt werden müssen.
set @id = 1; SELECT * from users WHERE id = @id ;
3. Ausführungsverarbeitung von SQL-Anweisungen
Je nach Verarbeitungsablauf gibt es zwei Arten von SQL-Anweisungen: Echtzeit-SQL und vorverarbeitetes SQL.
Instant SQL
Instant SQL wird von der Datenbank empfangen und nach der endgültigen Ausführung zurückgegeben. Der allgemeine Prozess ist wie folgt:
a. 词法和语义解析 b. 优化sql语句,制定执行计划 c. 执行并返回结果
Funktionen: Einmal kompilieren, einmal ausführen.
Vorverarbeitung von SQL
Eine bestimmte SQL im Programm kann wiederholt aufgerufen werden, oder nur einzelne Werte können bei jeder Ausführung unterschiedlich sein. Wenn Sie sich jedes Mal den Echtzeit-SQL-Prozess ansehen, ist die Effizienz relativ gering.
Zu diesem Zeitpunkt können Sie die Werte in SQL durch Platzhalter ersetzen und dann die Parameter binden. Wenn Sie die Anweisung wiederholt ausführen, müssen Sie nur die Parameter ersetzen, ohne eine lexikalische und semantische Analyse durchzuführen . Kann als SQL-Anweisung mit Vorlage oder parametrisiert betrachtet werden.
Funktionen: Einmal kompilieren und mehrmals ausführen, wodurch mehrfaches Parsen und andere Prozesse entfallen. (Mehrere Ausführungen bedeuten, dass dieselbe Anweisung in derselben Sitzung erneut ausgeführt wird, sodass sie nicht erneut analysiert und kompiliert wird.)
-- 语法 # 定义预处理语句 PREPARE stmt_name FROM preparable_stmt; # 执行预处理语句 EXECUTE stmt_name [USING @var_name [, @var_name] ...]; # 删除(释放)定义 {DROP | DEALLOCATE} PREPARE stmt_name;
4 Wie verhindert die Vorverarbeitung von SQL die SQL-Injection? Das auszuführende SQL wird dann kompiliert Im Cache-Pool gespeichert, wird DB nicht erneut kompiliert, sondern die SQL-Vorlage finden, die Parameter an sie übergeben und sie dann ausführen. Daher werden Befehle ähnlich wie oder 1==1 als Parameter übergeben und nicht semantisch analysiert und ausgeführt.
-- 预处理编译 SQL ,会占用资源 PREPARE stmt1 from 'SELECT COUNT(*) FROM users WHERE PASSWORD = ? AND user_name = ?'; set [@a](https://learnku.com/users/16347) = 'name1 OR 1 = 1'; set @b = 'pwd1'; EXECUTE stmt1 USING @b,[@a](https://learnku.com/users/16347); -- 使用 DEALLOCATE PREPARE 释放资源 DEALLOCATE PREPARE stmt1;
MySQL-Video-Tutorial
“Das obige ist der detaillierte Inhalt vonEin Artikel, der analysiert, warum SQL-parametrisierte Abfragen die SQL-Injection verhindern können. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!