利用准备好的具有串联和参数的语句



是否可以利用连接字符串和使用参数的准备语句?如果是,如何?

PreparedStatement prepstmt = 
conn.prepareStatement("SELECT productId, price FROM products WHERE productId = ?" 
+ "UNION SELECT productId, price FROM oldProducts WHERE productId = ?");
prepstmt.setString(1, productId);
prepstmt.setString(2, productId);

我的第一个想法是可以使用productId = 'a' OR 1=1进行开发,但我无法使其发挥作用。

提前感谢!

SQL注入的风险不是来自于连接固定字符串。我可以做以下事情,这将是安全的:

String sql = "SELECT " + "*" + " FROM " + "mytable" + " WHERE " + ...

关键是,在编译Java时,这个字符串的每一部分都是固定的。这些都不是来自任何不安全的内容。

SQL注入的风险部分是,不安全的内容可能会在准备SQL字符串之前输入它。因此,不安全的内容可能会影响准备过程中解析的SQL语法。

一些开发人员认为;不安全内容";与用户输入相同,但它可能来自其他来源,如读取文件、web服务的响应,甚至以前存储在数据库中的字符串数据。

对未知内容使用参数,对其余内容使用固定字符串,这样您就安全了。只要连接的每个子字符串本身是安全的,那么通过连接来构建查询并不重要。

第页。S.:记住用空格填充子字符串。您上面展示的示例将导致以下结果:

SELECT productId, price FROM products WHERE productId = ?UNION SELECT productId, price FROM oldProducts WHERE productId = ?

这可能是一个问题,具体取决于SQL解析器,因为您可能需要一个分隔?UNION的空间——请确保它是? UNION

最新更新