1

我正在使用 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 获得一个例外。

在这一点上,我完全糊涂了。有什么想法吗?我的假设是否正确?谢谢你的帮助。

4

0 回答 0