您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
16_JDBC各个类详解_PreparedStatement(sql注入复现及解决)
发布时间:2022-07-18 22:27:05编辑:雪饮阅读()
对于上篇的登录案例来说,由于sql语句是字符串,所以可以通过在密码中输入一些影响字符串解析结果的子sql(关闭”’”并结合or)以实现绕过登录。
a' or 'a' = 'a
那么基于预处理的改造后JdbcTest.java:
package day5;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class JdbcTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String user=sc.nextLine();
System.out.println("请输入密码");
String pwd=sc.nextLine();
if(new JdbcTest().login(user,pwd)){
System.out.println("登录成功!");
return;
}
System.out.println("登录失败!");
}
public boolean login(String user,String pwd){
Connection conn=null;
Statement stmt=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try{
conn= JDBCUtil.getConnection();
String sql="select * from user where user = ? and pwd = ?";
//这里PreparedStatement的实例也会像Statement的实例一样,是需要释放的
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,user);
pstmt.setString(2,pwd);
//这里需要注意:哥这里踩坑了,这里有使用预处理后,则不需要再传递sql语句了
rs=pstmt.executeQuery();
return rs.next();
}
catch(Exception e){
e.getStackTrace();
}
finally {
//PreparedStatement的实例也可以被释放,这里猜测应该是因为PreparedStatement也属于Statement的子类了
JDBCUtil.close(pstmt,rs,conn);
}
return false;
}
}
关键字词:jdbc,PreparedStatement,预处理,sql,注入,解决,复现