java 预处理
2015-10-14 21:45
239 查看
java中JDBC中,有个预处理功能,这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入。
用法就是如下边所示:
[java]
view plaincopy
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注入的作用了!
用法就是如下边所示:
[java]
view plaincopy
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注入的作用了!
相关文章推荐
- JAVA for循环语句的循环变量类型问题
- Java数组排序算法,冒泡,选择,插入,快速排序
- 单链表反转(递归和非递归) (Java)
- 简单工厂模式(java语言实现)
- struts 2的action中配置result视图结果加反斜杠的注意事项
- 看看Spring源码(二)——bean实例化
- JavaWeb三大组件——过滤器的运行机制理解
- eclipse中导入项目后中文成乱码解决办法
- JAVA多线程实现和应用总结
- java.util.ConcurrentModificationException 解决办法
- Java语法糖4:内部类
- java中三个点的用法
- 马士兵Java课堂笔记-3-Switch循环语句小细节
- springmvc 之 helloworld
- Java求最大公约数和最小公倍数
- java WEB开发 找回密码 如何通过注册时候的邮箱找回(修改)密码
- java记——循环求圆周率
- 使用javamail出现java.net.SocketException: Network is unreachable: connect异常 解决方法
- Myeclipse中修改JSP页面的pageEncoding默认编码
- 看看Spring的源码(一)——Bean加载过程