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

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

提问人:Sebin Mathew 提问时间:8/2/2019 最后编辑:Mark RotteveelSebin Mathew 更新时间:8/8/2019 访问量:701

问:

我需要以这样一种方式构建查询,以防止 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(query)

在第二种情况下,我执行以下操作:

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

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

java jdbc 准备语句 sql 注入

评论

0赞 8/2/2019
第二种情况是防止SQL注入的最佳方法,并且具有额外的好处,即它使数据库中的工作更快。

答:

2赞 Mark Rotteveel 8/2/2019 #1

您的第一个代码片段是不安全的,容易受到 SQL 注入的攻击。您不应使用该表单。

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

第二个片段是标准方式。它可以保护您免受 SQL 注入的影响。使用此表单。

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

1赞 German Portillo 8/8/2019 #2

您还可以使用 .它包括验证器、编码器和许多其他有用的东西。 例如,您可以执行以下操作[OWASP ESAPI library][1]

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

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

评论

0赞 Jeremy Moritz 8/8/2019
正是我想要的!谢谢!