稍后在预准备语句中使用的串联字符串是否会导致 sql 注入?

Does concatenated string that is later used in prepared statement cause sql injection?

提问人:ethicalhacker 提问时间:9/12/2022 更新时间:9/13/2022 访问量:212

问:

我正在评估一段代码来检查 sql 注入的可能性。 我注意到,在进行预处理语句之前,仅为 where 条件(名为 strwhere)构造了一个字符串,然后将其传递给创建预处理语句的函数。请注意,在strwhere中,它是使用字符串连接构建的,这是否会引发sql注入?或者只是传递给准备好的声明这一事实消除了这种风险?

法典:

String strWhere = whereString + " AND " + "(" + Table1.ID + "=" + ID + ")";
Rows = myTable.readRow(jdbcSource, stWhere);

readRow 函数中,它使用预准备语句构建最终查询。

Java 安全性 准备语句 SQL 注入

评论

0赞 Joop Eggen 9/12/2022
如果 ID 是字符串(不太可能),那么是的,这很危险。实际上,由于读者无法验证它,因此此代码会适得其反,因此不应努力。
4赞 Joachim Sauer 9/12/2022
whereString,并且都是 SQL 注入的潜在来源。您必须调查每一个,以检查这是否真的可行。例如,我假设它是一个编译时常量,在这种情况下,您不必担心外部用户以这种方式注入意外的 SQL(讨厌的开发人员仍然可能,但这通常不是我们在谈论 SQL 注入时的意思)。Table.IDIDTable.ID
0赞 Your Common Sense 9/12/2022
这回答了你的问题吗?如何修改代码以避免SQL注入攻击?
1赞 Your Common Sense 9/12/2022
预准备语句本身并不能保护查询。它不是一根魔杖,你可以用它来点击任何查询,它会变得神奇地免疫。预准备语句提供的保护来自参数。只有当变量没有连接到查询中,而是由参数表示时,prepared 语句才会发挥其魔力。标识符(如表名和列名)不能参数化,必须列入白名单

答:

1赞 Bill Karwin 9/13/2022 #1

是的,您显示的代码存在 SQL 注入的风险,具体取决于赋值方式和赋值方式。Table1.IDID

不可以,使用预准备语句并不能消除 SQL 注入的风险。

1赞 Egret 9/13/2022 #2

使用预准备语句有助于确保参数不会导致 SQL 注入。它不会阻止不受信任的数据进入语句的问题。如果或来自不受信任的来源,您仍然会遇到 SQL 注入问题。Table.IDID

您可以通过验证或引用不受信任的值来解决此问题。选项有:

  • 用引号引出表和 ID 名称,并验证表/ID 是否没有引号
  • 使用数据库中的参数化查询验证表和 ID 名称 - 因为在这种情况下这些是变量,所以这将是安全的。如果攻击者能够创建任意 ID 或表名,则不会保护您
  • 引用表和 ID 名称并对任何引号进行编码 - 这有点棘手