Dernier tutorie...login
Dernier tutoriel manuel MySQL
auteur:php.cn  temps de mise à jour:2022-04-15 14:04:12

Injection MySQL et SQL


Injection MySQL et SQL

Si vous obtenez des données saisies par l'utilisateur via une page Web et que vous les insérez dans une base de données MySQL, des problèmes de sécurité d'injection SQL peuvent alors survenir.

Ce chapitre expliquera comment empêcher l'injection SQL et utiliser des scripts pour filtrer les caractères injectés dans SQL.

La soi-disant injection SQL consiste à insérer des commandes SQL dans les soumissions de formulaires Web ou à saisir des noms de domaine ou des chaînes de requête pour les requêtes de page, incitant finalement le serveur à exécuter des commandes SQL malveillantes.

Nous ne devons jamais faire confiance aux entrées de l'utilisateur. Nous devons supposer que les données saisies par l'utilisateur ne sont pas sûres. Nous devons tous filtrer les données saisies par l'utilisateur.

Dans l'exemple suivant, le nom d'utilisateur saisi doit être une combinaison de lettres, de chiffres et de traits de soulignement, et le nom d'utilisateur doit comporter entre 8 et 20 caractères :

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysql_query("SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}
Let's voir La situation SQL suivante se produit lorsque les caractères spéciaux ne sont pas filtrés :
// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name='{$name}'");
Dans l'instruction d'injection ci-dessus, nous n'avons pas filtré la variable de $name, et nous l'avons insérée dans $name. pas besoin L'instruction SQL supprimera toutes les données de la table des utilisateurs.

Mysql_query() en PHP ne permet pas l'exécution de plusieurs instructions SQL, mais dans SQLite et PostgreSQL, plusieurs instructions SQL peuvent être exécutées en même temps, nous devons donc traiter les données de celles-ci utilisateurs.

Pour éviter l'injection SQL, nous devons prêter attention aux points suivants :

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

  • 2. N'utilisez jamais d'assemblage dynamique de SQL. Vous pouvez utiliser SQL paramétré ou utiliser directement des procédures stockées pour la requête et l'accès aux données.

  • 3. N'utilisez jamais une connexion à une base de données avec des privilèges d'administrateur. Utilisez une connexion à une base de données distincte avec des autorisations limitées pour chaque application.

  • 4. Ne stockez pas directement les informations confidentielles, ne cryptez pas ou ne hachez pas les mots de passe et les informations sensibles.

  • 5. Les informations d'exception de l'application doivent donner le moins d'indices possible. Il est préférable d'utiliser des informations d'erreur personnalisées pour envelopper le message d'erreur d'origine

  • <. 🎜>6. Les méthodes de détection d'injection SQL utilisent généralement des logiciels auxiliaires ou des plates-formes de sites Web pour détecter. Le logiciel utilise généralement l'outil de détection d'injection SQL jsky, et la plate-forme de site Web dispose de l'outil de détection de plate-forme de sécurité de site Web Yisi. NUMÉRISATION MDCSOFT, etc. L'utilisation de MDCSOFT-IPS peut se défendre efficacement contre l'injection SQL, les attaques XSS, etc.

Empêcher l'injection SQL

Dans les langages de script, tels que Perl et PHP, vous pouvez échapper aux données saisies par l'utilisateur pour empêcher l'injection SQL.

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

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM users WHERE name='{$name}'")

Injection dans l'instruction Like

Lors de l'interrogation de like, si les valeurs saisies par l'utilisateur incluent "_" et "%", cette situation se produira : l'utilisateur voulait à l'origine simplement interroger "abcd_" , et les résultats de la requête. Cependant, des problèmes "abcd_", "abcde", "abcdf", etc. se produiront également lorsque les utilisateurs souhaitent interroger "30%" (Remarque : 30 %).

Dans les scripts PHP, nous pouvons utiliser la fonction addcslashes() pour gérer la situation ci-dessus, comme le montre l'exemple suivant :

La fonction
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
addcslashes() ajoute une barre oblique inverse avant le caractère spécifié. .

Format de grammaire :

addcslashes(string,characters)
参数描述
string必需。规定要检查的字符串。
characters可选。规定受 addcslashes() 影响的字符或字符范围。

Tutoriels vidéo associés recommandés : tutoriel mysql