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

Méthodes d'injection et d'anti-injection MySQL et SQL

巴扎黑
Libérer: 2017-03-19 16:12:39
original
1234 Les gens l'ont consulté

Ce qu'on appelle l'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 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(chaîne,caractères)

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!

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