;
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
{
// 登录失败
...
}
如果用户输入的查询条件中,用户名字等于“fred”,密码等于“something”,则系统执行的查询实际上是:
SELECT id FROM users WHERE
username='fred' AND password=
'something'
这个查询能够正确地对用户名字和密码进行检查。但是,如果用户输入的查询条件中,名字等于“fred' AND ('a'='b”,密码等于“blah') OR 'a'='a”,此时系统执行的查询变成 了:
SELECT id FROM users
WHERE username='fred' AND (
'a'='b' AND password='blah') OR 'a'='a'
可以看出,这个查询无法正确地对用户名字和密码进行检查。Listing 6的代码要安全得多,它从根本上防止了用户修改SQL命令逃避检查。
(Listing 6)
String user = request.getAttribute("username"