提问人:ethicalhacker 提问时间:9/12/2022 更新时间:9/13/2022 访问量:212
稍后在预准备语句中使用的串联字符串是否会导致 sql 注入?
Does concatenated string that is later used in prepared statement cause sql injection?
问:
我正在评估一段代码来检查 sql 注入的可能性。 我注意到,在进行预处理语句之前,仅为 where 条件(名为 strwhere)构造了一个字符串,然后将其传递给创建预处理语句的函数。请注意,在strwhere中,它是使用字符串连接构建的,这是否会引发sql注入?或者只是传递给准备好的声明这一事实消除了这种风险?
法典:
String strWhere = whereString + " AND " + "(" + Table1.ID + "=" + ID + ")";
Rows = myTable.readRow(jdbcSource, stWhere);
在 readRow 函数中,它使用预准备语句构建最终查询。
答:
1赞
Bill Karwin
9/13/2022
#1
是的,您显示的代码存在 SQL 注入的风险,具体取决于赋值方式和赋值方式。Table1.ID
ID
不可以,使用预准备语句并不能消除 SQL 注入的风险。
1赞
Egret
9/13/2022
#2
使用预准备语句有助于确保参数不会导致 SQL 注入。它不会阻止不受信任的数据进入语句的问题。如果或来自不受信任的来源,您仍然会遇到 SQL 注入问题。Table.ID
ID
您可以通过验证或引用不受信任的值来解决此问题。选项有:
- 用引号引出表和 ID 名称,并验证表/ID 是否没有引号
- 使用数据库中的参数化查询验证表和 ID 名称 - 因为在这种情况下这些是变量,所以这将是安全的。如果攻击者能够创建任意 ID 或表名,则不会保护您
- 引用表和 ID 名称并对任何引号进行编码 - 这有点棘手
评论
whereString
,并且都是 SQL 注入的潜在来源。您必须调查每一个,以检查这是否真的可行。例如,我假设它是一个编译时常量,在这种情况下,您不必担心外部用户以这种方式注入意外的 SQL(讨厌的开发人员仍然可能,但这通常不是我们在谈论 SQL 注入时的意思)。Table.ID
ID
Table.ID