提问人:Lucky Ratnawat 提问时间:5/29/2023 最后编辑:Gord ThompsonLucky Ratnawat 更新时间:5/29/2023 访问量:53
“Drop View <View_Name>”上的 Bandit 漏洞
Bandit vulnerability on 'Drop View <View_Name>'
问:
我不确定为什么 bandit 将以下内容通知为“检测到可能的格式化 SQL 查询。请改用参数化查询。
conn.execute(f"DROP VIEW {view_name};")
有没有办法对view_name进行参数化?还是串联是在这里移除土匪旗帜的唯一方法?
答:
2赞
Bill Karwin
5/29/2023
#1
在 SQL 中,不能参数化标识符,只能参数化值。视图名称是一个标识符。带引号的字符串常量或数值常量是一个值。
在格式化的 SQL 语句中使用应用程序变量作为值更为常见,因此 Bandit 检测工具建议使用参数也就不足为奇了。但在这种情况下,你不能这样做。
使用动态标识符创建 SQL 语句时,您能做的最好的事情就是确保您的变量免受 SQL 注入威胁。也就是说,它不包含不受信任的内容。要么在代码中显式设置它,不允许使用任何外部内容,要么使用一些模式匹配代码来确保它是有效的视图名称,而不是其他名称。view_name
评论
0赞
Lucky Ratnawat
5/29/2023
感谢您的建议,我将确保该变量在注入时是安全的。但是,我们是否应该通过 Bandit608 来抑制/消除这些标志?
1赞
Bill Karwin
5/29/2023
我从未使用过 Bandit,所以我不知道存在哪些选项。您应该查阅文档或提出该项目的问题,询问他们对像您这样的情况有什么建议。无论如何,他们的错误消息非常具有误导性。
上一个:防止动态 sql 注入
评论
conn.execute(f"""DROP VIEW "{view_name}";""")