En insérant des commandes SQL dans les soumissions de formulaires Web ou en saisissant des noms de domaine ou des chaînes de requête pour les requêtes de page, vous pouvez finalement inciter le serveur à exécuter des commandes SQL malveillantes. Plus précisément, il utilise des applications existantes pour injecter des commandes SQL (malveillantes) dans le moteur de base de données en arrière-plan en vue de leur exécution, obtenant ainsi une base de données sur un site Web présentant des failles de sécurité.
SQL Injection, SQL injection, utilise en fait des vulnérabilités de code pour modifier la sémantique de SQL, formant ainsi des instructions SQL malveillantes
$username = $_POST['username']; $password = $_POST['password']; $query = "select * from users where username = '{$username}' and password = '{$password}'"; // 判断是否登录成功 if (DB::select($query)) { return true; } return false;
À première vue, il n'y a rien de mal avec ce pseudo-code. Il détermine simplement si le mot de passe du compte. est correct et renvoie si c'est vrai, la connexion est autorisée. Mais si le nom d'utilisateur entrant est 123' ou 1=1;#, alors l'instruction SQL devient
select * from users where username = '123' or 1=1; # and password = '{$password}'";
Cette instruction SQL malveillante retournera vrai à tout moment, car 1=1
us Comme mentionné précédemment , SQL Injection utilise des vulnérabilités de code pour modifier la sémantique de SQL, ce qui signifie que ORM est également un point d'injection potentiel. En prenant tp3.2 comme exemple, il y a le code suivant
$result = D('User')->where([ 'username' => $_POST['username'], 'password' => $_POST['password'], ]); if ($result) { echo '登录成功'; } else { echo '登录失败'; }
Ce code ne semble avoir aucun problème, mais si le nom d'utilisateur est passé dans username[0]=neq&username[1]=1111, l'instruction de requête devient
$result = D('User')->where([ 'username' => ['neq', 111], 'password' => $_POST['password'], ]);
alors le résultat de $result sera toujours vrai. Les instructions de prétraitement sont le moyen le plus efficace d'empêcher l'injection SQL
Les instructions de prétraitement sont implémentées par la base de données, telles que les instructions préparées MySQL. Tout d'abord, parlons du processus de base de prétraitement
MySQL reçoit le modèle SQL prétraité et commence immédiatement l'analyse (lexicale et syntaxe)
Le client envoie des données pour remplacer les espaces réservés (?) dans le modèle SQL
$stmt = $pdo->prepare("select * from users where username = '?' and password = '?'"); $stmt->execute("123' or 1=1;#", 'test');
Recommandations associées : "
Tutoriel mysql"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!