JDBC登录案例开发-预编译语句防止注入攻击
最近在学jdbc连接数据库,但不明白为什么要预编译,多此一举呢?而后自己查了一些资料,欢迎交流指正呀。
1.什么是注入攻击
当我们在使用jdbc连接数据库完成登录验证工作时,从键盘录入账号和密码 ,
有时利用一定规则输入密码,无论该数据在数据库中匹配与否都能成功登录。
下面举例:
String account="51188688"; //输入账号
String password=" 123' or '4'='4 "; //输入密码
String sql="select * from admin where account='"+account+"'
and password='"+password+"' ";
加载驱动,获得连接,返回结果集,我们输出解析的sql语句
System.out.println(sql);
结果:
显然,密码在解析为sql语句时,or ‘4’='4’不再为密码内容,促使条件始终为true,此时所有数据均会加载到结果集中,登陆成功!
结果:
接下来是解决方法。
2.预编译语句设置参数
直接上代码:
String account="51188688"; //输入账号
String password=" 123' or '4'='4 "; //输入密码
String sql="select * from admin where account=? and password=? ";
//预编译sql语句
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,account); //sql语句中的第1个?为 account (“51188688”)
statement.setString(2,password);//sql语句中的第2个?为 password
这样直接将账号与密码作为参数传输进去,便避免了注入问题。
扩展:类似因sql语句导致踩坑的还有很多。例如当在某系统中输入若干条件,如果where中用内连接查询某员工信息时,若员工信息存在,但因输入薪资多打了0超过约束条件时,便会显示无此员工信息,此时用外连接就可以解决这个问题。