SQL注入式攻击是指利用设计上的脆弱性,在目标服务器上运行Sql命令以及进行其他方式的攻击动态生成Sql命令。没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据。
Java程序也存在SQL注入问题,可以通过使用PreparedStatement类来阻止SQL注入。
一段可能产生SQL注入的代码如下:
String user = request.getParameter("username");
String pass = request.getParameter("password");
String query = "SELECT id FROM users WHERE username="+user+" AND password="+pass;
Statement stmt = con.createStatement(query);
ResultSet rs = con.executeQuery(query);
if (rs.next())
{
// 登录成功
int id = rs.getInt(1);
...
}
else
{
// 登录失败
...
}
正确的做法如下:
String user = request.getParameter("username");
String pass = request.getParameter("password");
String query = "SELECT id FROM users WHERE username=? AND password=?";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, user);
stmt.setString(2, pass);
ResultSet rs = stmt.executeQuery();
if (rs.next())
{
// 登录成功
int id = rs.getInt(1);
...
}
else
{
// 登录失败
...
}
安全编码规范:
要使用参数化的查询、占位符、或者参数绑定来构造Sql语句;即使调用的是存储过程,也不要使用字符串链接来构造Sql语句,同时代码中尽量使用PreparedStatement类,如果没有使用就一定要对输入做特殊字符过滤,过滤的字符至少包括(大小写无关):
过滤字符 |
‘ (单引号) |
And |
Select |
update |
chr( |
delete |
insert |
mid( |
master. |
--和;的组合 |
exec |
backup |
declare |
char( |
/* |
代码检查关键词:java.sql, javax.sql,sql,select