Maison > base de données > tutoriel mysql > le corps du texte

Introduction détaillée aux méthodes d'injection et de prévention MySQL et SQL

黄舟
Libérer: 2017-03-09 11:08:46
original
1195 Les gens l'ont consulté

Cet article présente principalement en détail les méthodes d'injection et de prévention MySQL et SQL. Il a une très bonne valeur de référence. Si vous en avez besoin, vous pouvez vous y référer

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

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

1. 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 输入异常";
}
Copier après la connexion

Jetons un coup d'œil à la situation SQL qui 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}'");
Copier après la connexion

Dans l'instruction d'injection ci-dessus, nous n'avons pas filtré la variable $name. Une instruction SQL inutile a été insérée dans $name, ce qui supprimera toutes les données de la table des utilisateurs.

2. 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 vérifier strictement les données de ces utilisateurs.

Pour éviter l'injection SQL, nous devons faire 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 ; convertir des guillemets simples et des "-" doubles, 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 de connexion à une base de données avec des privilèges d'administrateur. Utilisez une connexion à une base de données distincte avec des privilèges limités 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 les informations 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.

3. 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}'");
Copier après la connexion

4.Injection dans la déclaration J'aime

Lors d'une requête like, si les valeurs saisies par l'utilisateur incluent "_" et "%", cette situation se produira : l'utilisateur voulait à l'origine uniquement interroger "abcd_", mais les résultats de la requête incluent "abcd_", "abcde" , et "abcdf" Attendez ; des problèmes se produiront également lorsque les utilisateurs souhaitent interroger "30 %" (remarque : trente pour cent).

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

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
Copier après la connexion

La fonction addcslashes() ajoute une barre oblique inverse avant le caractère spécifié.

Format de grammaire :

  addcslashes(string,characters)
Copier après la connexion

Description du paramètre

chaîne Obligatoire. Spécifie la chaîne à vérifier.

caractères facultatifs. Spécifie les caractères ou la plage de caractères affectés par addcslashes().


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:php.cn
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!