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

Vous faire comprendre l'injection SQL en une minute

醉折花枝作酒筹
Libérer: 2021-08-02 16:01:41
avant
2107 Les gens l'ont consulté

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;
Copier après la connexion

À 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}'";
Copier après la connexion

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 '登录失败';
}
Copier après la connexion

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'],
]);
Copier après la connexion

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');
    Copier après la connexion

    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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal