English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL Injection et MySQL

如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。

本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符。

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。

以下示例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Voyons ce qui se passe sans filtrer les caractères spéciaux : }}

// Définir $name a inséré des instructions SQL non désirées
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}');

Dans les instructions d'injection ci-dessus, nous n'avons pas filtré la variable $name, $name a inséré des instructions SQL non désirées, ce qui supprimera toutes les données de la table users.

En PHP, mysqli_query() ne permet pas d'exécuter plusieurs instructions SQL en même temps, mais SQLite et PostgreSQL peuvent exécuter plusieurs instructions SQL en même temps, donc nous devons vérifier strictement ces données utilisateur.

Pour prévenir l'injection SQL, nous devons prêter attention à plusieurs points :

  • 1.Ne jamais faire confiance aux entrées de l'utilisateur. Vérifiez les entrées de l'utilisateur, vous pouvez utiliser des expressions régulières ou limiter la longueur ; pour les guillemets simples et Double "-" pour la conversion, etc.

  • 2.Ne jamais utiliser de construction dynamique de SQL, utiliser des SQL paramétrés ou utiliser directement des procédures stockées pour la recherche et l'insertion de données.

  • 3.Ne jamais utiliser de connexion de base de données avec des privilèges administrateur, utiliser une connexion de base de données à privilèges limités pour chaque application.

  • 4.Ne pas stocker directement des informations confidentielles, chiffrer ou hasher les mots de passe et les informations sensibles.

  • 5.Les informations d'exception de l'application doivent fournir le moins de conseils possible, mieux vaut utiliser des messages d'erreur personnalisés pour envelopper les informations d'erreur d'origine

  • 6.Les méthodes de détection des injections SQL généralement utilisent des logiciels ou des plateformes de sites Web pour la détection, les logiciels généralement utilisent des outils de détection d'injection SQL jsky, et les plateformes de sites Web incluent les outils de détection de sécurité de site Web Yisi, MDCSOFT SCAN, etc. En utilisant MDCSOFT-IPS peut efficacement défendre contre l'injection SQL, les attaques XSS, etc.

Prévention de l'injection SQL

Dans les langages de script, tels que Perl et PHP, vous pouvez échapper les données d'entrée de l'utilisateur pour prévenir l'injection SQL.

L'extension MySQL de PHP fournit la fonction mysqli_real_escape_string() pour échapper aux caractères spéciaux d'entrée.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}');

Injection dans l'expression LIKE

Lors de la recherche par LIKE, si la valeur saisie par l'utilisateur contient "_" et "%", il se produit ce cas : l'utilisateur voulait simplement rechercher "abcd_", mais les résultats de la recherche incluent "abcd_", "abcde", "abcdf" et ainsi de suite ; l'utilisateur doit rechercher"30%" (Note : trente pour cent) pose également des problèmes.}

Dans un script PHP, nous pouvons utiliser la fonction addcslashes() pour traiter les situations ci-dessus, comme dans l'exemple suivant :

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%';

La fonction addcslashes() ajoute un antislash avant les caractères spécifiés.

Format syntaxique :

addcslashes(string,characters)
ParamètresDescription
stringObligatoire. Spécifiez la chaîne à vérifier.
caractèresOptionnel. Spécifiez les caractères ou les plages de caractères affectés par addcslashes().

Pour des applications spécifiques, voir :Fonction addcslashes() PHP