预处理语句setString执行子查询

时间:2013-04-25 23:42:29

标签: java mysql jdbc prepared-statement

我正在使用java + mysql。我有以下代码:

String sql = "INSERT INTO tableA (id, age) VALUES (1, ?)";

PreparedStatement statement = connection.prepareStatement(sql);
stmt.setString(age);
stmt.execute();

假设String age :-(是来自用户的输入,我希望上面的代码可以防止SQL注入。我发现mysql驱动程序不允许在一个语句中进行多个查询,所以像

76); Drop table tableB; -- )
即使我没有使用预准备语句,

也会被mysql拒绝。 但是,在后一种情况下输入如

(select id from tableB where age = 10) // lets assume this returns 20

将被接受在数据库中插入(1,20)。 通过以我上面描述的方式使用preparedStatement,我希望这种输入会被拒绝,防止SQL注入攻击。但是,我看到的是非常奇怪的。我不确定这个子查询是否被执行,但我看到的是在数据库中插入的记录(1,0)。 我希望我宁愿从mysql中获取异常。

此时我完全糊涂了。有什么想法吗?我的假设是否正确?谢谢你的帮助。

0 个答案:

没有答案