我正在使用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中获取异常。
此时我完全糊涂了。有什么想法吗?我的假设是否正确?谢谢你的帮助。