Java-java程序防止sql注入的方法
12306刚爆出sql注入的漏洞(http://hyfw.12306.cn/hyinfo/action/ClcscxAction_index?cllx=G 这个页面,自重输入1'),之前一些关于sql注入的讨论大多数都是php程序的,想跟大家讨论一下java程序防止sql注入应该注意的地方
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
如果是用C#的话就很好处理里了,直接AddParameters,就可以通过参数的形式就可以防止注入了,如果是自己拼接sql的话,还是得自己去处理那些注入的字符!有些时候还是有很多地方考滤不到的啊!
我们一般是用java代码和前台js判断两个结合来防止sql注入
java代码这块一般就是PreparedStatement函数,js就是判断页面的输入是否有关键字,然后后台代码部分加一个过滤器,判断每次提交时候的参数里是否有关键字
1。数据库访问用预定义会话PreparedStatement,从根本上防止SQL截断
2。后台过滤,简单的验证数据格式/长度正确,至于过滤/转义各种特殊符号由第一步说的来处理;对于那些必须登录后才能操作的,首先验证session("username")=='' or session("userpwd")=='')等条件直接禁止操作
3。前台过滤,对于必要的input输入信息进行格式验证;尤其有对于用户名、密码之类的页面最好设置验证码(防止猜测的注入,减轻服务器压力)
1.通过PreparedStatement进行SQL操作。
2.并不一次性全部传入参数,将一部分参数与查询结果进行比较。
Java更安全,只要使用PreparedStatement,就不会存在注入问题。至今还没遇到用了PreparedStatement还会被注入的情况。
关键还是在人
使用PreparedStatement进行预处理,过滤URL中的特殊字符、转义符
1:
使用PreparedStatement
2:
除显示外,任何为防止注入的转义/escape行为都应该避免,不应该靠转义来防止注入
3:
数据库储存字段类型严格限制,例如int类型绝不要用varchar储存
4:
不必要的话不要显示用户输入结果
BTW:
2,3,4跟注入无关,跟XSS有关
第一种采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可:
String sql= "select * from users where username=? and password=?;
PreparedStatement preState = conn.prepareStatement(sql);
preState.setString(1, userName);
preState.setString(2, password);
ResultSet rs = preState.executeQuery();
...
第二种是采用正则表达式将包含有 单引号('),分号(;) 和 注释符号(--)的语句给替换掉来防止SQL注入
public static String TransactSQLInjection(String str)
{
return str.replaceAll(".*([';]+|(--)+).*", " ");
}
userName=TransactSQLInjection(userName);
password=TransactSQLInjection(password);
String sql="select * from users where username='"+userName+"' and password='"+password+"' "
Statement sta = conn.createStatement();
ResultSet rs = sta.executeQuery(sql);
用PreparedStatement函数,还有正则匹配来去除一些不安全的代码
说说我的思路。(没有进行实际验证而且我这里只提出想法,不考虑其他因素)
对于通过通过链接来进行注入的情况:(我对SQL注入了解不多)
http://某网站/某业务/ClcscxAction_index?cllx=G
--【方案】:出发点是在请求中就过滤掉 (打小打早)。 通过人为的加入参数特征来忽略掉恶意输入---
通过在输出端加密(参数值),然后在服务器端进行检验(我看到有些示例可以直接识别出来)。验证通过则进行解密。
PS:
我还是个新手,所以一定考虑的不周详。
欢迎交流,但是勿喷!!!!
1,参数检查,特殊字符转义
2,所有参数用 PreparedStatement 传入