Maison >base de données >tutoriel mysql >Qu'est-ce que l'injection SQL ? Vous faire comprendre l'injection SQL à partir de zéro
Comprendre l'injection SQL à partir de zéro, qu'est-ce que l'injection SQL ? L'injection SQL signifie que je suis le seul à pouvoir faire fonctionner la base de données. Je vous laisse simplement entrer le contenu et partir, mais vous entrez la commande, exploitant ainsi la base de données à mon insu
Regardez le scénario de cas suivant, qui est un scénario de connexion normal :
Et lorsque nous utilisons le nom d'utilisateur ': –, nous pouvons nous connecter avec succès en entrant le mot de passe ↓
À ce stade, en comparant les deux SQL, vous pouvez constater qu'en fait, l'utilisateur a mis fin au SQL interne plus tôt en écrivant le symbole sql dans le nom de l'utilisateur et en commentant les conditions de recherche dans la seconde moitié de la phrase pour éviter le problème de connexion par mot de passe.
L'injection SQL signifie que je suis le seul à pouvoir faire fonctionner la base de données. À l'origine, je vous laissais simplement entrer le contenu et partir, mais vous entrez la commande, opérant ainsi. la base de données à mon insu
La raison pour laquelle le SQL ci-dessus utilise l'épissage dynamique, donc la façon dont le SQL est transmis en mai Changez la sémantique de SQL.
L'épissage dynamique est l'utilisation mixte de variables Java et d'instructions SQL en Java : sélectionnez * from user où userName='"+userName+"' et password = '"+password " '
Utilisez donc le SQL paramétré de PrepareStatement. En déterminant d'abord la sémantique puis en passant les paramètres, la sémantique du SQL ne sera pas modifiée en raison des paramètres transmis . (Transmettez les paramètres via setInt, setString, setBoolean)
//建立数据连接 conn=ds.getConnection(); //1.设置prepareStatement带占位符的sql语句 PreparedStatement ptmt = conn.prepareStatement("select * from user where userName = ? and password = ?"); ptmt.setString(1, "张三"); //2.设置参数 ptmt.setString(2, "123456"); rs=ptmt.executeQuery(); while(rs.next()){ System.out.println("登陆成功"); return; } System.out.println("登陆失败");
Fonctionnalités paramétrées :
1. Définir l'instruction SQL de PrepareStatement avec un espace réservé
Mode d'exécution de l'instruction SQL par l'instruction :
stmt=conn.createStatement(); rs=stmt.executeQuery("select userName from user");
2. Définir les paramètres
PerparedStatement hérite de Statement, et les fonctionnalités qui le rendent paramétré en SQL sont principalement utilisées ici.
Redirigé : https://blog.csdn.net/qq_30258957/article/details/78145885
Ajouté : 1. PreparedStatement étend la déclaration ;
2. L'instruction convient à l'exécution de SQL statique (inconditionnel) et PreparedStatement convient à l'exécution de SQL dynamique (conditionnel);
3.PreparedStatement peut éviter les attaques par injection;
Articles connexes :
Une injection PHP anti-SQL que je pense très sûre doit être crackée
Compréhension approfondie de l'injection SQL et des mesures préventives
Vidéos associées :
Tutoriel vidéo sur le développement pratique de centres commerciaux SQL Injection-PHP
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!