Cet article vous apporte des connaissances pertinentes sur MySQL. Il explique principalement pourquoi les requêtes paramétrées SQL peuvent empêcher l'injection SQL. Les amis intéressés peuvent jeter un œil ci-dessous. J'espère que cela sera utile à tout le monde.
Pourquoi les requêtes paramétrées SQL peuvent-elles empêcher l'injection SQL ?
1. Qu'est-ce que l'injection SQL ?
Insérez des commandes SQL dans la chaîne de requête de la soumission du formulaire ou du nom de domaine d'entrée ou de la demande de page, incitant le serveur à exécuter des commandes SQL malveillantes.
-- 正常的查询语句 select * from users where username = 'a'; -- 恶意的查询语句 select * from users where username = 'a' or 1==1;
2. Qu'est-ce qu'une requête paramétrée
Une requête paramétrée signifie que lors de l'interrogation de la base de données, les paramètres sont utilisés pour donner des valeurs là où les données doivent être renseignées.
set @id = 1; SELECT * from users WHERE id = @id ;
3. Traitement d'exécution des instructions SQL
Il existe deux types d'instructions SQL selon le flux de traitement : le SQL en temps réel et le SQL prétraité.
Instant SQL
Instant SQL est reçu de la base de données et renvoyé après l'exécution finale. Le processus général est le suivant :
a. 词法和语义解析 b. 优化sql语句,制定执行计划 c. 执行并返回结果
Caractéristiques : Compilez une fois, exécutez une fois.
Prétraitement SQL
Un certain SQL dans le programme peut être appelé à plusieurs reprises, ou seules les valeurs individuelles peuvent être différentes à chaque fois qu'il est exécuté. Si vous regardez à chaque fois le processus SQL en temps réel, l'efficacité est relativement faible.
À ce stade, vous pouvez remplacer les valeurs dans SQL par des espaces réservés. Générez d'abord un modèle SQL, puis liez les paramètres lorsque vous exécutez l'instruction à plusieurs reprises, il vous suffit de remplacer les paramètres sans effectuer d'analyse lexicale et sémantique. . Peut être considéré comme une instruction SQL modélisée ou paramétrée.
Caractéristiques : Compilez une fois et exécutez plusieurs fois, éliminant ainsi plusieurs analyses et autres processus. (Plusieurs exécutions signifient exécuter à nouveau la même instruction dans la même session, elle ne sera donc pas analysée et compilée à nouveau)
-- 语法 # 定义预处理语句 PREPARE stmt_name FROM preparable_stmt; # 执行预处理语句 EXECUTE stmt_name [USING @var_name [, @var_name] ...]; # 删除(释放)定义 {DROP | DEALLOCATE} PREPARE stmt_name;
4 Comment le prétraitement SQL empêche-t-il l'injection SQL
Le SQL à exécuter est compilé Ensuite, il l'est. stocké dans le pool de cache. Lorsque DB exécute l'exécution, il ne le compilera pas à nouveau, il trouvera le modèle SQL, lui transmettra les paramètres, puis l'exécutera. Par conséquent, les commandes similaires à ou 1==1 seront transmises en tant que paramètres et ne seront pas sémantiquement analysées ni exécutées.
-- 预处理编译 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;
Apprentissage recommandé : "Tutoriel vidéo MySQL"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!