首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考。
一个能连接数据库的应用。
1.对用户端输入的数据进行严格防范;
2.使用PreparedStatement执行Sql语句;
3.不仅仅要在页面层面进行验证,在服务端层面还要同步进行这些验证;
使用SQL注入攻击多在特殊字符上下手脚,如“’”,“*”,“/” ,”–”等,如果用正则表达式限制特殊字符输入,这些手段将没有效果。下面的代码将阻止含有特殊字符的请求。
if(Pattern.matches(“\w+”, name)==false || Pattern.matches(“\w+”, pswd)==false ){
// 返回login界面
request.setAttribute(“feedbackMsg”, “用户名和密码不允许包括特殊字符”);
RequestDispatcher dispatcher = request.getRequestDispatcher(“/web/page/login1.jsp?curr=0”);
dispatcher.forward(request, response);
return;
}
SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement执行SQL语句,其后只是输入参数, SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。示例代码如下:
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
String sql=” select count(*) from usertable where name=? and password=? “;
ps=conn.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, password);
PreparedStatement的错误使用
用PreparedStatement来防范SQL注入攻击是因为“因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构”,如果如下使用则起不到这个效果,因为SQL语句和参数没有分开,它们被组合在一起被一次性提交了。
原文地址:http://blog.csdn.net/ffm83/article/details/44197137