提问人:Sebin Mathew 提问时间:8/2/2019 最后编辑:Mark RotteveelSebin Mathew 更新时间:8/8/2019 访问量:701
如何在 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(query)
在第二种情况下,我执行以下操作:
PreparedStatement ps = connection.prepareStatement(query)
ps.setString(1,name);
我想知道什么是行业标准?您是使用字符串追加方式构建查询,然后准备语句,还是已经准备语句并稍后传递参数?
答:
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
正是我想要的!谢谢!
评论