因为我偶然发现了这个问题并且接受的答案对我不起作用,所以我自己研究了这个:
为什么 urllib 存在安全风险
urllib 不仅打开 http:// 或 https:// URL,还打开 ftp:// 和 file://。这样就可以在执行机器上打开本地文件,如果要打开的 URL 可以被外部用户操作,这可能会带来安全风险。
如何解决这个问题
您自己负责在使用 urllib 打开 URL 之前对其进行验证。例如
if url.lower().startswith('http'):
req = urllib.request.Request(url)
else:
raise ValueError from None
with urllib.request.urlopen(req) as resp:
[...]
如何解决这个问题,以便 linter(例如bandit)不再抱怨
至少 bandit 有一个简单的函数调用黑名单。只要你使用 urllib,linter 就会发出警告。即使您确实验证了您的输入,如上所示。(或者甚至使用硬编码的 URL)。
在该行添加#nosec
注释以抑制来自 bandit 的警告,或查找 linter/code-checker 的抑制关键字。最好的做法是还添加额外的评论,说明为什么您认为这在您的情况下不值得警告。