【发布时间】:2012-10-21 17:38:28
【问题描述】:
Java:
PreparedStatement stmt = myConnection.prepareStatement("CALL myStoredRoutine(?, ?, ?)");
stmt.setString(1, a);
stmt.setString(2, b);
stmt.setString(3, c);
stmt.executeQuery();
如果我的存储例程在 MySQL 中,未过滤的字符串是否可以将某些内容注入我的代码中?
【问题讨论】:
-
基本上没有。但是如果你的存储过程构建动态sql语句并执行它,它可能会变成一个可能的SQL注入。
-
假设您有此查询
SELECT * FROM userTable WHERE userName = ?。如果您使用的是preparedStatement,它会直接发送到编译它的数据库,然后setString()方法中的userName将被替换。如果它发现一个非法值,它将导致抛出异常。userNamelike' or '1'='1将被视为一个完整的字符串,而不是涉及像or和=这样的运算符的语句。因此,它是安全的。
标签: java mysql stored-procedures prepared-statement