我有python腳本,它有代碼。在shell中使用shell = True的子進程的消毒輸入
...
...
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.split
和shlex.quote
我可以清理它。
我將我的代碼更改爲。
...
...
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
'bandit'無法確定命令參數是否被充分消毒;它只能檢測到你正在使用'Popen',這可能會成爲一個安全問題。你最好離開'shell = False'並準備'cmd',這個方式可以直接被'exec'使用。 – chepner
分析器無法判斷您運行的命令是否是您希望運行的命令。根據你正在做什麼,沙盒化intepreter(例如[codejail](https://github.com/edx/codejail))可能是合適的或必要的。這涉及輸入消毒和嚴格控制的操作系統權限的組合。 – gecko
@chepner,'exec'的意思是'subprocess.exec'? – Nilesh