Java-如何避免SQL注入漏洞

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net

1、简单又有效的方法是使用PreparedStatement
采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX(如:setString)方法传值即可。
好处:
(1).代码的可读性和可维护性变好。
(2).PreparedStatement尽最大可能提高性能。
(3).最重要的一点是极大地提高了安全性。
原理:
SQL注入只对SQL语句的编译过程有破坏作用,而PreparedStatement的SQL语句编译阶段已经准备好了,执行阶段只是把输入串作为数据处理,而不再对SQL语句进行解析、准备,因此也就避免了SQL注入问题。
一些热门ORM框架在处理SQL时候也都使用了PreparedStatement,比如MyBatis。
我们在使用MyBatis要注意:在注入参数值得时候使用#{xxx},#{xxx}已经启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。
“${xxx}”这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。
有时有些操作要使用这种方式,比如传入表,模糊匹配等。这时可以使用bind+#{}防止SQL注入(#{}进行预编译,传递的参数不进行编译,只作为参数,相当于PreparedStatement)。
bind元素可以从OGNL表达式中创建一个变量并将其绑定到上下文。比如:

<select id="selectBlog" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG WHERE title LIKE #{pattern}
</select>

2、使用过滤器
如果我们做不到所有的SQL语句都使用PreparedStatement,我们可以使用过滤器,进行全局的拦截这些字符串。在过滤器中,使用正则表达式过滤传入的参数。使用正则表达式,判断是否匹配:

String begin="您的请求参数信息";

//可以通过配置文件,去配置这些特殊字符,以便随时添加一些关键字。
String pattern="|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like";

Pattern r = Pattern.compile(pattern);
Matcher isMatch = r.matcher(begin);
if(isMatch.find()){
    //危险请求参数
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>