“Drop View <View_Name>”上的 Bandit 漏洞

Bandit vulnerability on 'Drop View <View_Name>'

提问人:Lucky Ratnawat 提问时间:5/29/2023 最后编辑:Gord ThompsonLucky Ratnawat 更新时间:5/29/2023 访问量:53

问:

我不确定为什么 bandit 将以下内容通知为“检测到可能的格式化 SQL 查询。请改用参数化查询。

    conn.execute(f"DROP VIEW {view_name};")

有没有办法对view_name进行参数化?还是串联是在这里移除土匪旗帜的唯一方法?

sql 注入 参数化 bandit-python

评论

0赞 Lucky Ratnawat 5/29/2023
@Progman:感谢您的输入。这里使用的编程语言是 Python (FastAPI),ORM 是 SQLAlchemy。
0赞 snakecharmerb 5/29/2023
您可以尝试引用视图名称。conn.execute(f"""DROP VIEW "{view_name}";""")
0赞 Lucky Ratnawat 5/29/2023
@snakecharmerb:谢谢你,我会尽力让你知道的。但我怀疑它是否会抛出语法错误,因为view_name已经是一个字符串。
1赞 Bill Karwin 5/29/2023
你指的是强盗,这是你的意思吗?github.com/PyCQA/bandit请注意,Stack Overflow 的“bandit”标签指的是 Ruby on Rails (github.com/bmuller/bandit) 的一些 gem。

答:

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,所以我不知道存在哪些选项。您应该查阅文档或提出该项目的问题,询问他们对像您这样的情况有什么建议。无论如何,他们的错误消息非常具有误导性。