审核 url 对允许的方案开放。允许使用 "file:" 或自定义方案通常是意想不到的
Audit url open for permitted schemes. Allowing use of "file:" or custom schemes is often unexpected
我在Python
中使用这个语句
jsonreq = json.dumps({'jsonrpc': '2.0', 'id': 'qwer', 'method': 'aria2.pauseAll'})
jsonreq = jsonreq.encode('ascii')
c = urllib.request.urlopen('http://localhost:6800/jsonrpc', jsonreq)
在执行代码质量测试时,我得到了这个 warning/error
Audit url open for permitted schemes. Allowing use of "file:" or custom schemes is often unexpected.
我想这就是你需要的
import urllib.request
req = urllib.request.Request('http://www.example.com')
with urllib.request.urlopen(req) as response:
the_page = response.read()
因为我偶然发现了这个问题,而接受的答案对我不起作用,所以我自己研究了一下:
为什么 urlib 存在安全风险
urlib不仅可以打开http://或https:// URLs,还可以打开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 就会发出警告。即使您确实如上所示验证您的输入。 (或者甚至使用硬编码 URLs)。
向该行添加 #nosec
注释以抑制强盗的警告或查找 linter/code-checker 的抑制关键字。最好还添加额外的评论,说明为什么您认为在您的情况下这不值得警告。
对于以上答案无法解决的人。
您可以改用 requests
库,它不在 bandit 中列入黑名单。
https://bandit.readthedocs.io/en/latest/blacklists/blacklist_calls.html#b310-urllib-urlopen
import requests
url = 'http://www.example.com'
the_page = requests.get(url)
print(the_page.json()) # if the response is json
print(the_page.text) # if the response is some text
我在Python
中使用这个语句 jsonreq = json.dumps({'jsonrpc': '2.0', 'id': 'qwer', 'method': 'aria2.pauseAll'})
jsonreq = jsonreq.encode('ascii')
c = urllib.request.urlopen('http://localhost:6800/jsonrpc', jsonreq)
在执行代码质量测试时,我得到了这个 warning/error
Audit url open for permitted schemes. Allowing use of "file:" or custom schemes is often unexpected.
我想这就是你需要的
import urllib.request
req = urllib.request.Request('http://www.example.com')
with urllib.request.urlopen(req) as response:
the_page = response.read()
因为我偶然发现了这个问题,而接受的答案对我不起作用,所以我自己研究了一下:
为什么 urlib 存在安全风险
urlib不仅可以打开http://或https:// URLs,还可以打开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 就会发出警告。即使您确实如上所示验证您的输入。 (或者甚至使用硬编码 URLs)。
向该行添加 #nosec
注释以抑制强盗的警告或查找 linter/code-checker 的抑制关键字。最好还添加额外的评论,说明为什么您认为在您的情况下这不值得警告。
对于以上答案无法解决的人。
您可以改用 requests
库,它不在 bandit 中列入黑名单。
https://bandit.readthedocs.io/en/latest/blacklists/blacklist_calls.html#b310-urllib-urlopen
import requests
url = 'http://www.example.com'
the_page = requests.get(url)
print(the_page.json()) # if the response is json
print(the_page.text) # if the response is some text