Maison >base de données >tutoriel mysql >[Tutoriel mysql] 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 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 输入异常"; }
Prenons un coup d'oeil Lorsque les caractères spéciaux ne sont pas filtrés, la situation SQL qui se produit :
// 设定$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 avons inséré une instruction SQL dont nous n'avions pas besoin dans $name. Supprimez toutes les données de la table des utilisateurs.
Mysql_query() en PHP n'est pas autorisé à exécuter 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 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 ; convertir des guillemets simples et des "-" doubles, etc.
2. N'utilisez jamais d'assemblage dynamique de SQL. Vous pouvez utiliser du 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 privilèges limités pour chaque application.
v 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. Un logiciel auxiliaire ou une plate-forme de site Web généralement adopté est utilisé pour la détection. 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 d'entrée spéciaux.
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 à l'origine vient voulait interroger "abcd_", mais il y a "abcd_", "abcde", "abcdf", etc. dans les résultats de la requête ; des problèmes surviendront également lorsque l'utilisateur souhaite 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 spécifié personnage.
Format de syntaxe :
addcslashes(string,characters)
Paramètres
Description
chaîne Obligatoire. Spécifie la chaîne à vérifier.
caractères Facultatif. Spécifie les caractères ou la plage de caractères affectés par addcslashes().
Pour des applications spécifiques, vous pouvez afficher : Fonction PHP addcslashes()
Ce qui précède est le contenu de [tutoriel mysql] MySQL et injection SQL. Pour plus de contenu connexe, veuillez faire attention au. Site Web chinois PHP (www.php.cn ) !