为允许的方案打开的审核url。允许使用“file:”或自定义方案通常是意外的

2024-04-24 20:56:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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)

在这里,当我执行代码质量测试时,我得到了这个警告/错误

Audit url open for permitted schemes. Allowing use of "file:" or custom schemes is often unexpected.


Tags: idjsonrequestascii语句urllibmethodencode
2条回答

我想这就是你需要的

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://url,还打开ftp://和文件://。 有了这一点,就有可能在执行机器上打开本地文件,如果要打开的URL可以被外部用户操纵,这可能会带来安全风险。在

如何修复

您自己负责在使用urllib打开URL之前验证它。 E、 g

if url.lower().startswith('http'):
  req = urllib.Request.request(url)
else
  raise ValueError from None

with urllib.request.urlopen(req) as resp:
  [...]

如何解决这个问题,使皮棉(例如bandit)不再抱怨

至少bandit有一个简单的函数调用黑名单。只要使用urllib,linter就会发出警告。即使您确实验证了上面所示的输入。(甚至使用硬编码的url)。在

在行中添加#nosec注释以禁止bandit发出的警告,或查找linter/代码检查器的suppression关键字。最好的做法是添加额外的注释,说明为什么您认为这不值得在您的案例中给出警告。在

相关问题 更多 >