Maison > base de données > tutoriel mysql > Un article analysant pourquoi les requêtes paramétrées SQL peuvent empêcher l'injection SQL

Un article analysant pourquoi les requêtes paramétrées SQL peuvent empêcher l'injection SQL

藏色散人
Libérer: 2023-03-17 16:09:44
avant
2094 Les gens l'ont consulté

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.

Un article analysant pourquoi les requêtes paramétrées SQL peuvent empêcher l'injection SQL

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;
Copier après la connexion

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 ;
Copier après la connexion

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. 执行并返回结果
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal