在Windows上防止外壳注射

问题描述:

这是否认为安全?在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

没有,外壳注塑仍然发生在你​​的情况这: 剪贴板(“你好; 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

如果您使用read in the manual,在shell中执行命令容易受到注入攻击,如果您使用来自不可信源的未处理文本作为命令。如果程序使用的权限比用户通常拥有的权限多,这只是一个问题。

这与不可变对象的问题完全分离。 Python字符串是immutable