preparestatement可以避免注入
2016-07-11 21:03
281 查看
之所以PreparedStatement能防止注入,是因为它把单引号转义了,变成了\',这样一来,就无法截断SQL语句,进而无法拼接SQL语句,基本上没有办法注入了。
不使用这个,我们一般做查询或更新的条件,是用字符串拼起来的,例如
但是这样带来了一个风险,因为id是界面上客户输入的,所以如果没有进入校验,有人输入了一个aa' or '1'='1 把这个值代入到上面的sql语句里面,sql语句就变成了
这样就能查到所有的数据了,也就是SQL注入
但是,如果用preparedstatement的话,就没有这个问题
然后再将值set进去,如果值里面有引号等字符时,会自动的启用转义,不会破坏这个SQL语句的结果,也就不会造成SQL注入了
大家都知道,Java中JDBC中,有个预处理功能,这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入。
用法就是如下边所示:
[java] view plain copy
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注入的作用了!
不使用这个,我们一般做查询或更新的条件,是用字符串拼起来的,例如
但是,如果用preparedstatement的话,就没有这个问题
大家都知道,Java中JDBC中,有个预处理功能,这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入。
用法就是如下边所示:
[java] view plain copy
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注入的作用了!
相关文章推荐
- 18大经典数据挖掘算法小结
- 运维脚本规范
- NKOI 1887 借教室
- LeetCode 171. Excel Sheet Column Number
- lua脚本对utf8字符串过滤中文字符
- docker学习笔记
- Android进阶----使用AES+RSA对http请求进行加密
- 【一天一道LeetCode】#226. Invert Binary Tree
- 【一天一道LeetCode】#226. Invert Binary Tree
- 错误 1402 无法打开项 UNKNOWNComponents(2008/2005sql安装)
- 算法 把二叉查找树转变成排序的双向链表
- 51nod 动态规划基础
- 保存文件
- 中山培训 2016.7.9
- iOS中按钮点击事件处理方式
- shell学习笔记
- linux中断分层技术分析
- Nexus安装和配置
- python 调用数据库
- HDU 4778 Gems Fight!【博弈+DP】