Maison > Article > base de données > Dépannage des problèmes d'injection SQL
<img src="https://img.php.cn/upload/article/000/000/052/5ffcf9b492b47340.jpg" alt="Dépannage des problèmes d'injection SQL" >
推荐(免费):<a href="https://www.php.cn/sql/" target="_blank">SQL教程</a>
SQL
Qu'est-ce que l'injection ?
Regardez la définition de l'Encyclopédie Baidu :
Ah, c'est un paragraphe tellement long que je ne veux pas le lire. Utilisons un exemple pour expliquer quoi SQL注入
. est :
Créez une nouvelle base de données, créez un tableau et ajoutez deux lignes de données :
use db1;create table user( id int primary key auto_increment, username varchar(32), password varchar(32));insert into user values(null,'zhangsan','123');insert into user values(null,'lisi','234');
Le tableau est comme indiqué ci-dessous :
Ensuite, écrivez-le en utilisant avec désinvolture JDBC
Opération de connexion :
package com.wzq.jdbc;import com.wzq.util.JDBCUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Scanner;/* * 需求: * 1、通过键盘录入用户名和密码 * 2、判断用户是否登陆成功 * */public class JDBCDemo05 { public static void main(String[] args) { Scanner cin = new Scanner(System.in); System.out.println("请输入用户名:"); String username = cin.nextLine(); System.out.println("请输入密码:"); String password = cin.nextLine(); boolean res = new JDBCDemo05().login(username, password); if (res) System.out.println("登陆成功!"); else System.out.println("登陆失败!"); } public boolean login(String username, String password) { if (username == null || password == null) { return false; } Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //1、获取数据库连接 conn = JDBCUtils.getConnection(); //JDBCUtils工具类 //2、定义sql String sql = "select * from user where username = '" + username + "' and password = '" + password + "'"; //3、获取执行sql的对象 stmt = conn.createStatement(); //4、执行sql rs = stmt.executeQuery(sql); return rs.next(); } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(rs, stmt, conn); } return false; }}
Testez-le :
Vous pouvez voir qu'il n'y a aucun problème avec l'inspection ordinaire. Utilisez maintenant SQL注入
:
a' or 'a'='a
J'ai été surpris de constater que la connexion a réussi. Sortez
et jetez un œil : sql
select * from user where username = 'askjdhjksahd' and password = 'a' or 'a' = 'a'Vous pouvez voir les conditions après
Quel que soit le résultat qui est vrai, le tableau entier sera affiché : where
Donc. , en résumé Comme mentionné ci-dessus : lors de l'épissage de
, certains mots-clés spéciaux de sql
sont impliqués dans l'épissage des chaînes, ce qui entraînera des problèmes de sécurité. C'est pourquoi la connexion ci-dessus réussit. sql
au lieu de l'objet PreparedStatement
. L'objet Statement
est une sous-classe de l'objet PreparedStatement
. Il est précompilé Statement
, il s'exécutera donc plus rapidement que sql
. Statemnet
utilise PerpaerdStatement
comme espace réservé, et utilise ?
pour attribuer une valeur à setXxx(索引,值)
?
et écrivons le code : Statement
public boolean login(String username, String password) { if (username == null || password == null) { return false; } Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { //1、获取数据库连接 conn = JDBCUtils.getConnection(); //JDBCUtils类 //2、定义sql String sql = "select * from user where username = ? and password = ?"; //3、获取执行sql的对象 pstmt = conn.prepareStatement(sql); pstmt.setString(1,username); pstmt.setString(2,password); //4、执行sql rs = pstmt.executeQuery(); return rs.next(); } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(rs, pstmt, conn); } return false; }Testez-le :
Résolu avec succès !
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!