gpt4 book ai didi

python - 在 python 中使用 shell=True 清理子进程的输入

转载 作者:行者123 更新时间:2023-12-01 03:55:23 24 4
gpt4 key购买 nike

我有 python 脚本,其中有代码。

...
...
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True)
output, error = p.communicate()
...
...

当我运行bandit时它给出了错误。

>> Issue: [B602:subprocess_popen_with_shell_equals_true] subprocess call with shell=True identified, security issue.
Severity: High Confidence: High
Location: mypackage/myfile.py:123
123 stderr=subprocess.PIPE,
124 shell=True)
125 output, error = p.communicate()

然后我做了一些谷歌,发现我必须清理我的输入并使用 shlex.splitshlex.quote我可以 sanitizer 它。

我将代码更改为。

...
...
p = subprocess.Popen(shlex.split(shlex.quote(cmd)),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True)
output, error = p.communicate()
...
...

但我仍然遇到同样的错误,运行时有什么方法可以消除此错误bandit -r mypackage/myfile.py

最佳答案

So, user enter command which he want to run

如果用户已经可以运行任何命令,包括 bash然后bandit关于 shell=True 的警告不适用。

如果用户只被允许为固定命令选择一些参数,例如 grep 的搜索查询,则该警告是有意义的。命令:

rc = call(['grep', '-e', query, path])

无论用户指定什么query是;它不会让它运行其他命令(仅运行grep)。

shell=True 进行比较:

rc = call("grep -e '%s' '%s'" % (query, path), shell=True) #XXX don't do it

用户可以通过 query = "a' /dev/null; rm -rf '"这会产生 grep -e 'a' /dev/null; rm -rf '' 'path'命令。

shell=True在这种情况下,即使用户无意运行,也允许用户运行任意命令。这称为 shell 注入(inject)。

您可以调用pipes.quote(query) ,以避免天真的攻击,但在一般情况下它可能会失败,这就是为什么 shell=True如果输入不是来自可信来源,则应避免。

关于python - 在 python 中使用 shell=True 清理子进程的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37552338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com