预编译可以防止sql注入的原因:进行预编译之后,sql语句已经被数据库分析,编译和优化了,并且允许数据库以参数化的形式进行查询,所以即使有敏感字符数据库也会当做属性值来处理而不是sql指令了
大家都知道,java中jdbc中,有个预处理功能,这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防sql注入,严格的说,应该是预防绝大多数的sql注入。
用法就是如下边所示:
string sql="update cz_zj_directpayment dp"+ "set dp.projectid = ? where dp.payid= ?";try {preparedstatement pset_f = conn.preparestatement(sql);pset_f.setstring(1,inds[j]);pset_f.setstring(2,id);pset_f.executeupdate(sql_update);}catch(exception e){//e.printstacktrace();logger.error(e.message());}
那为什么它这样处理就能预防sql注入提高安全性呢?其实是因为sql语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,sql语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库以参数化的形式进行查询,当运行时动态地把参数传给preprarestatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个sql指令,如此,就起到了sql注入的作用了!
以上就是预编译为什么可以防止sql注入的详细内容。