Maison  >  Article  >  base de données  >  Vous faire comprendre l'injection SQL en une minute

Vous faire comprendre l'injection SQL en une minute

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-08-02 16:01:222079parcourir

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é.

Vous faire comprendre l'injection SQL en une minute

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

est injecté via ORM

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

    Audit de code
  • Comment les instructions préparées empêchent 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

MySQL exécute l'instruction et renvoie le résultat

    Supprimer l'instruction préparée (facultatif)
  • Alors, comment les instructions préparées empêchent-elles l'injection SQL ? Tout d'abord, ce qu'on appelle l'injection SQL consiste à modifier de force la sémantique de SQL. Lors de la première étape, l'instruction a été traitée et la sémantique de SQL a été corrigée. Le remplacement des espaces réservés à la deuxième étape ne modifiera pas la sémantique de SQL. Ce qui suit est un exemple de PHP PDO
  • $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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer