我正在评估一段代码,以检查sql注入的可能性。我注意到,在生成prepare语句之前,只为where条件(名为strwhere(构造一个字符串,然后将其传递给创建prepare语句的函数。请注意,在使用字符串串联构建的strwhere中,这是否会引发sql注入?还是仅仅是传递给一份事先准备好的声明就消除了这种风险?
代码:
String strWhere = whereString + " AND " + "(" + Table1.ID + "=" + ID + ")";
Rows = myTable.readRow(jdbcSource, stWhere);
在readRow函数中,它使用prepared语句构建最终查询。
是的,您显示的代码有SQL注入的风险,这取决于Table1.ID
和ID
的赋值方式。
不,使用准备好的语句并不能消除SQL注入的风险。
使用准备好的语句有助于确保参数不会导致SQL注入。它不会阻止不受信任的数据进入语句的问题。如果Table.ID
或ID
来自不受信任的源,那么您仍然会遇到SQL注入问题。
您可以通过验证或引用不受信任的值来解决此问题。选项包括:
- 引用表和ID名称,并验证表/ID是否没有引号
- 在数据库中使用参数化查询验证表和ID名称-因为在这种情况下这些都是变量,所以这是安全的。如果攻击者能够创建任意ID或表名,则这不会保护您
- 引用表和ID名称,并对任何引用进行编码——这有点难理解