如何在 Java 中构建查询以防止 SQL 使用准备好的语句进行注入

How to build query in Java to prevent SQL injection using prepared statement

我需要构建一个查询以防止 SQL 注入攻击的可能性。

我知道有两种构建查询的方法。

String query = new StringBuilder("select * from tbl_names where name = '").append(name).append(';).toString();

String query = "select * from tbl_names where name = ? ";

在第一种情况下,我所做的只是connection.preparestatement(查询)

在第二种情况下,我会做类似的事情:

PreparedStatement ps = connection.prepareStatement(query)
ps.setString(1,name);

我想知道行业标准是什么?您是使用字符串附加方式构建查询然后准备语句还是已经准备好语句然后再传递参数?

您的第一个代码片段不安全且易受 SQL 注入攻击。 你不应该使用那个表格。

为了确保您的第一个片段安全,您需要手动转义该值以防止 SQL 注入。这很难正确地做到,并且选择错误的处理值的方式可能会降低性能,具体取决于底层数据库(例如,如果您为整数列提供字符串文字,某些数据库系统将不会使用索引)。

第二个片段是标准方式。它可以保护您免受 SQL 注入。 使用这个表格。

使用带有参数占位符的准备好的语句要简单得多,而且它还允许您重用具有不同值集的已编译语句。此外,根据数据库的不同,这在跨连接重用查询计划方面具有额外的性能优势。

您也可以使用 [OWASP ESAPI library][1]。它包括验证器、编码器和许多其他有用的东西。 例如,你可以做

ESAPI.encoder().encodeForSQL(Codec,input);

更多编解码器正在开发中。目前支持 MySQL 和 Oracle。其中之一可能对您的情况有所帮助。