我正在忙于撰寫一個需要用戶輸入的 Python3 腳本,輸入用作傳遞給 shell 的命令中的引數。
該腳本僅供受信任的內部用戶使用 - 但是我寧愿有一些應急措施來確保命令的有效執行。
示例 1:
import subprocess
user_input = '/tmp/file.txt'
subprocess.Popen(['cat', user_input])
這將輸出'/tmp/file.txt'的內容
示例 2:
import subprocess
user_input = '/tmp/file.txt && rm -rf /'
subprocess.Popen(['cat', user_input])
結果(如預期):
cat: /tmp/file.txt && rm -rf /: No such file or directory
這是一種可接受的輸入消毒方法嗎?根據最佳實踐,除此之外還有什么我應該做的嗎?
uj5u.com熱心網友回復:
你選擇的方法,
import subprocess
user_input = 'string'
subprocess.Popen(['command', user_input])
command和 static一樣好,并且user_input作為單個引數傳遞給command. 只要你不做一些非常愚蠢的事情
subprocess.Popen(['bash', '-c', user_input])
你應該安全一點。
對于需要多個引數的命令,我建議您向用戶請求多個輸入,例如執行此操作
user_input1='file1.txt'
user_input2='file2.txt'
subprocess.Popen(['cp', user_input1, user_input2])
代替
user_input="file1.txt file2.txt"
subprocess.Popen(['cp'] user_input.split())
如果您想進一步提高安全性,您可以:
- 顯式設定
shell=False(以確保您永遠不會運行 shell 命令;這已經是當前的默認值,但默認值可能會隨著時間的推移而改變):subprocess.Popen(['command', user_input], shell=False) - 使用絕對路徑
command(以防止通過 注入惡意可執行檔案PATH):subprocess.Popen(['/usr/bin/command', user_input]) - 明確指示支持它的命令停止決議選項,例如
subprocess.Popen(['rm', '--', user_input1, user_input2]) - 盡可能多地在本機上做,例如
cat /tmp/file.txt可以用幾行 Python 代碼來完成(如果這應該是一個因素,這也會增加可移植性)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328876.html
上一篇:在不影響時間的情況下減去天數
