以后在prepared语句中使用的串联字符串是否会导致sql注入



我正在评估一段代码,以检查sql注入的可能性。我注意到,在生成prepare语句之前,只为where条件(名为strwhere(构造一个字符串,然后将其传递给创建prepare语句的函数。请注意,在使用字符串串联构建的strwhere中,这是否会引发sql注入?还是仅仅是传递给一份事先准备好的声明就消除了这种风险?

代码:

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

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

是的,您显示的代码有SQL注入的风险,这取决于Table1.IDID的赋值方式。

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

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

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

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

最新更新