Maison > Article > base de données > Méthodes d'injection et d'anti-injection MySQL et SQL
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 输入异常"; }
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}'");
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}'");
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}%'");
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!