所谓sql注入,就是通过把sql命令插入到web表单递交或输入域名或页面请求的查询字符串,最终达到
欺骗服务器执行恶意的sql命令,比如先前的很多影视网站泄露vip会员密码大多就是通过web表单递交
字符爆出的,这类表单特别容易受到sql注入式攻击,当应用程序输入内容来构造动态sql语句以访问数据
库时,会发生sql注入攻击。
预防sql注入方法
1.预编译语句集
采用预编译语句集,它内置了处理sql注入的能力,只要使用它的setxxx方法传值即可。
使用好处:
(1)代码的可读性和可维护性
(2)PreparedStatement尽最大可能提高性能
(3)最重要的一点是极大地提高了安全性
代码示例:
1
2
3
4
5<span style="font-size:14px;">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();</span>
上述的原理是:sql注入只对sql语句的准备(编译)过程有破坏,而PreparedStatement已经准备好了,执行阶段
只是把输入串当作数据处理,而不对sql语句进行解析,从而也就避免了sql注入。
2.使用正则表达式来过滤传入的参数
可以使用replace方法来实现正则对于输入参数的过滤:
1
str.replace(".*([';]+|(--)+).*"," ")
可以通过上面的代码来将传入的符合上述正则表达式的参数替换成空格,从而达到过滤。
字符串过滤
通用的方法:在||之间的参数可以根据自己程序的需要添加
1
2
3
4
5
6
7
8
9
10
11public static boolean sql_inj(String str)
{
String injstr="select|'|exec|insert|and|delete|update|count|*|%|chr|mid|master|truncate|or|,";
String injstra=split(injstr,"|");
for(int i=0;i<injstra.length;i++)
{
if(str.indexof(injstra[i])>=0)
return true;
}
return false;
}
上述代码的思路是定义一串字符串,字符串包含了要过滤的信息以|为分隔符,判断输入的字符串是否包含了这个信息
若有就会返回一个大于等于0的索引号。就能将其做过滤操作。