是java.sql包下的一个接口,想必在学习过jdbc的同学们就对这个接口有一定的印象,Statement接口下有很多方法是对sql语句处理的,例如executeQuery(“sql语句”)方法
Statement stmt=con.createStatement();
String sql="select * from dept";
ResultSet result=stmt.executeQuery(sql);
但是随着java越来越完善,发现Statement有很多缺点,其中有个缺点就是会发生sql注入,就是当输入例如账号密码等信息的时候,一些懂sql语句的人他会在密码后输入一些sql语句关键字来强制进入; 那么这是为什么呢? 因为啊,当用statement来操作用户输入这些操作的时候他是采用字符串拼接的方式,它里面的sql语句是用户传入后,拼接好了之后才交给DBMS来进行编译。
String sq="select * from b_name wherename=
'"+varname+"'and passwd='"+varpasswd+"'";
这里面的 varname和 passwd 是需要用户来传入的,如果一些懂sql语法的人在传入passwd的时候传入1234’or ‘a’='a 这种格式的话,经过拼接的话就是passwd= 1234’ or ‘a’=‘a’ ;这我们知道a=a是恒成立的,所以一定会通过,就会造成恶意进入; 那我们怎末解决呢?答案是Prestatement
Prestatement
- Prestatement接口是statement的一个子接口,Prestatement就能解决上面所述的sql注入问题,Prestatement也能进行批量处理:
- 它是怎末解决注入问题呢?
是因为他进行了预处理,上面说过,就是应为不合法的拼接,然后DBMS编译才造成sql注入,现在Prestatement先把sql语句进行编译,然后再传值,这样就避免了这个问题。sql语句里面需要传值的地方用 ? 代替,这被称为占位符。
如有错误请指出,谢谢
|