我需要构建一个查询,以防止 SQL 注入(inject)攻击的可能性。
我知道有两种构建查询的方法。
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);
我想知道行业标准是什么?您是使用字符串追加方式构建查询然后准备语句还是已经准备好语句然后再传递参数?
最佳答案
您的第一段代码不安全并且容易受到 SQL 注入(inject)攻击。 您不应使用该表格。
为了确保您的第一个片段安全,您需要手动转义该值以防止 SQL 注入(inject)。这很难正确地做到,并且选择错误的处理值的方式可能会降低性能,具体取决于底层数据库(例如,如果您为整数列提供字符串文字,某些数据库系统将不会使用索引)。
第二个片段是标准方式。它可以保护您免受 SQL 注入(inject)攻击。 使用此表单。
使用带参数占位符的预准备语句要简单得多,它还允许您重用具有不同值集的编译语句。此外,根据数据库的不同,这在跨连接重用查询计划方面具有额外的性能优势。
关于java - 如何在 Java 中构建查询以防止使用准备好的语句进行 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57319882/