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

标签 java jdbc prepared-statement sql-injection

我需要构建一个查询,以防止 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/

相关文章:

java - 在 Java 1.7+ 上,我们是否仍需要使用 StringBuffer.append 转换 "this string"+ "should"+ "be"+ "joined"以获得最佳实践?

java - 为什么我在运行一个简单的 Spring Boot 应用程序时总是得到状态为 "404"的 Whitelabel 错误页面

java - 自动序列图

java - Fitnesse Maven 类路径错误

java - Postgres JDBC 驱动程序未返回错误行号,如 PGAdmin 中所示

java - 用户验证密码检查数据库

Java mysql 准备好的语句更新不起作用

java - 在 Java 中更新 blob

sql - 防止目标数据库处于还原模式时出错(sql 准备)

php - 带有准备好的语句的多查询