L'injection SQL (SQLi) est une attaque par injection qui peut exécuter des instructions SQL malveillantes. Il donne aux attaquants un contrôle total sur le serveur de base de données derrière une application Web en insérant du code SQL arbitraire dans les requêtes de base de données.
Un attaquant peut utiliser des vulnérabilités d'injection SQL pour contourner les mesures de sécurité des applications ; peut contourner l'authentification et l'autorisation d'une page Web ou d'une application Web, et récupérer le contenu de l'intégralité de la base de données SQL. ;L'injection SQL peut également être utilisée pour ajouter, modifier et supprimer des enregistrements dans la base de données.
Comment empêcher l'injection SQL en php ?
1. Quand êtes-vous le plus vulnérable aux attaques par injection SQL
Lorsqu'une application utilise le contenu d'entrée pour construire des instructions SQL dynamiques pour accéder au Des attaques par injection SQL dans la base de données se produiront
2. Comment empêcher l'injection SQL
a Ne faites jamais confiance aux entrées de l'utilisateur et ne les vérifiez pas, guillemets simples. et "_" peuvent être convertis via des expressions régulières ou une longueur limitée
Obsolète :
//$user = htmlspecialchars(addslashes($user)); //$pwd = htmlspecialchars(addslashes($pwd)); //$yzm = htmlspecialchars(addslashes($yzm));
Doit être utilisé :
$user = htmlspecialchars(addslashes($user)); $pwd = htmlspecialchars(addslashes($pwd)); $yzm = htmlspecialchars(addslashes($yzm));
b, 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
Déconseillé :
// $sql = "select * from user where user='$user' and pwd ='$pwd'";
doit être utilisé :
$sql = "select * from user where user=? and pwd =?";
c, N'utilisez jamais de connexion à une base de données avec des privilèges d'administrateur, utilisez une connexion de données distincte avec des autorisations limitées pour chaque application
$conn = @new mysqli('localhost','root','','myschool'); if($conn->connect_error){ die('连接数据库失败'); } $conn->set_charset('utf8');
d, Ne stockez pas directement les informations confidentielles, cryptez ou des mots de passe HASH et des informations sensibles
e, La méthode de détection de l'injection QL consiste généralement à utiliser un logiciel auxiliaire ou une détection de plate-forme de site Web, un logiciel Généralement, l'outil de détection d'injection SQL jsky est utilisé, et la plate-forme de site Web a Yisi. L'outil de détection de plate-forme de site Web
3. Le prétraitement de l'extension php mysqli
est souvent utilisé dans les opérations mysqli. classe, classe MYSQL_STMT, classe MYSQLI_RESULT, le prétraitement est principalement effectué à l'aide de la classe MYSQL_STMT.
Le prétraitement est un moyen important d'empêcher l'injection SQL et revêt une grande importance pour améliorer la sécurité des sites Web. Le principe de fonctionnement des instructions de prétraitement :
(1) Prétraitement : Créer. un modèle d'instruction SQL et l'envoyer à la base de données. Les valeurs réservées sont marquées par des paramètres ?
Exemple : insérer dans myguests(firstname,lastname,email) des valeurs (?,?,?)
(2) Analyse de base de données, compilation, optimisation de requêtes sur un modèle d'instruction SQL et stockage Le résultat n'est pas affiché.
if ($stmt = $conn->prepare($sql)) { $stmt -> bind_param("ss",$user,$pwd); $stmt -> execute(); $stmt -> store_result(); //$res = $conn ->query($sql); if ($stmt->num_rows==0) { show_error('输入的用户名或密码错误','demo1.html'); } $stmt -> close(); } $conn ->close();
(3) est exécuté. Enfin, la valeur liée par l'application est passée au paramètre ("?" La base de données exécute l'instruction. l'instruction plusieurs fois si la valeur du paramètre est différente
Pour plus de connaissances sur PHP, veuillez visiter le Site Web PHP chinois !
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!