Maison > Article > base de données > En savoir plus sur l'injection SQL et comment y remédier
Recommandé (gratuit) : Tutoriel SQL
L'injection SQL fait référence à l'intrusion de données saisies par l'utilisateur par le Web applications Il n'y a aucun jugement sur la légalité ou le filtrage laxiste. Les attaquants peuvent ajouter des instructions SQL supplémentaires à la fin des instructions de requête prédéfinies dans l'application Web pour réaliser des opérations illégales à l'insu de l'administrateur, trompant ainsi la base de données. Le serveur effectue des requêtes arbitraires non autorisées. obtenir en outre des informations de données correspondantes.
1. Cas d'injection SQL
Simulez un cas d'injection SQL de connexion utilisateur L'utilisateur saisit le nom d'utilisateur et le mot de passe sur la console, puis utilise la concaténation de chaînes de déclaration. Implémentez la connexion utilisateur.
1.1 Créez d'abord la table utilisateur et les données dans la base de données
-- 创建一张用户表 CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(20), `password` VARCHAR(50), PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入数据 INSERT INTO users(username,`password`) VALUES('张飞','123321'),('赵云','qazxsw'),('诸葛亮','123Qwe'); INSERT INTO users(username,`password`) VALUES('曹操','741258'),('刘备','plmokn'),('孙权','!@#$%^'); -- 查看数据 SELECT * FROM users;
1.2 Écrire un programme de connexion
import java.sql.*; import java.util.Scanner; public class TestSQLIn { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8"; Connection conn = DriverManager.getConnection(url,"root","123456"); //System.out.println(conn); // 获取语句执行平台对象 Statement Statement smt = conn.createStatement(); Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String userName = sc.nextLine(); System.out.println("请输入密码:"); String password = sc.nextLine(); String sql = "select * from users where username = '" + userName + "' and password = '" + password +"'"; //打印出SQL System.out.println(sql); ResultSet resultSet = smt.executeQuery(sql); if(resultSet.next()){ System.out.println("登录成功!!!"); }else{ System.out.println("用户名或密码错误,请重新输入!!!"); } resultSet.close(); smt.close(); conn.close(); } }
1.3 Connexion normale
Après avoir entré le nom d'utilisateur et le mot de passe corrects, il affiche "Connexion réussie"
1.4 Échec de connexion
Lors de la saisie d'un nom d'utilisateur ou d'un mot de passe incorrect, le message "Le nom d'utilisateur ou le mot de passe est incorrect, veuillez le ressaisir"
1.5 Simulation d'injection SQL
La chaîne concaténée contient ou '1'='1', qui est une condition constante, donc même si le l'utilisateur et le mot de passe précédents n'existent pas, tous les enregistrements seront également supprimés, donc "Connexion réussie" s'affiche
Erreur de syntaxe SQL 1.6
En utilisant l'épissage, SQL apparaîtra également des erreurs de syntaxe et d'autres erreurs, telles que
2. À l'aide de la méthode Statement, les utilisateurs peuvent modifier le texte original via l'épissage de chaînes. La véritable signification de SQL entraîne un risque d'injection SQL. Pour résoudre l'injection SQL, vous pouvez utiliser l'objet de prétraitement PreparedStatement au lieu de Statement pour le traitement.
1.1 Écrire un nouveau programme
import java.sql.*; import java.util.Scanner; public class TestSQLIn { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8"; Connection conn = DriverManager.getConnection(url,"root","123456"); //System.out.println(conn); // 获取语句执行平台对象 Statement // Statement smt = conn.createStatement(); Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String userName = sc.nextLine(); System.out.println("请输入密码:"); String password = sc.nextLine(); String sql = "select * from users where username = ? and password = ? "; // System.out.println(sql); // ResultSet resultSet = smt.executeQuery(sql); PreparedStatement preparedStatement = conn.prepareStatement(sql); preparedStatement.setString(1,userName); preparedStatement.setString(2,password); ResultSet resultSet = preparedStatement.executeQuery(); if(resultSet.next()){ System.out.println("登录成功!!!"); }else{ System.out.println("用户名或密码错误,请重新输入!!!"); } preparedStatement.close(); resultSet.close(); // smt.close(); conn.close(); } }2.2 Connectez-vous normalement
2.3 Nom d'utilisateur et mot de passe incorrects
Lorsque le nom d'utilisateur ou le mot de passe est mal saisi, le message "Le nom d'utilisateur ou le mot de passe est incorrect, veuillez le ressaisir"
2.4 Simuler l'injection SQL
Selon la situation précédente, écrivez l'injection SQL Après le test, l'injection SQL ne se produira plus.
2.5 Simulation des erreurs de syntaxe SQL
Après avoir utilisé la classe de prétraitement, la saisie de contenu avec des guillemets simples ou doubles ne fonctionnera pas SQL des erreurs de syntaxe réapparaîtront
3.Résumé
Les principales différences entre Statement et PreparedStatement sont les suivantes :
L'instruction est utilisée pour exécuter des instructions SQL statiques. Lors de l'exécution, une instruction SQL préparée doit être spécifiéeCe 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!