2012-03-01 40 views
0

這是否認爲安全?在Windows上防止外殼注射

def clipboard(foo): 
import sys, subprocess 
system = sys.platform 

if 'win' in system: 
    cmd = 'echo %s | CLIP' % (foo,) 
    subprocess.call(cmd, shell=True) 

if __name__ == '__main__': 
    clipboard('RMDIR /S/Q C:\') #something terrible that actually works. 

不用說,這只是將一些輸入複製到剪貼板。我問:通過將我的參數包裝成格式化的字符串,引用元組中的元素,我是否可以防止發生shell注入攻擊?

+0

'shell是否等於true ...現在怎麼辦?代表一些用戶輸入? – 2012-03-01 19:24:31

+0

我爲你澄清。 – Droogans 2012-03-01 20:36:56

回答

1

沒有,外殼注塑仍然發生在你​​的情況這: 剪貼板(「你好; RMDIR/S/Q C:\」) 這將會把「你好」到剪貼板,但執行命令rmdir。

可能使用引號和shlex可以幫助,如:

import shlex 
if 'win' in system: 
    safe_arg='"%s"'%foo 
    assert len(shlex.split(safe_arg)) == 1, "Injection attempt detected" 
    cmd = 'echo %s | CLIP' % (safe_arg,) 

編輯:上面的代碼仍然是既不安全也不強勁。我認爲以下情況至少會有所好轉,但仍可能有誤報:

foo = str(foo.strip('"').strip()) 
safe_arg = '"%s"'%foo 
if '"' in foo: 
    if (len(shlex.split(safe_arg, False, False)) != 1): ... 
+0

我試圖將'shlex'和'Popen'一起使用,就像[在他們的例子中](http://docs.python.org/library/subprocess.html#subprocess.Popen)所示的文檔一樣。我沒想過用'shlex'來驗證參數。這很實用,很容易理解。謝謝。 – Droogans 2012-03-02 16:21:55

0

如果您使用read in the manual,在shell中執行命令容易受到注入攻擊,如果您使用來自不可信源的未處理文本作爲命令。如果程序使用的權限比用戶通常擁有的權限多,這只是一個問題。

這與不可變對象的問題完全分離。 Python字符串是immutable