Python 防止Windows上的外壳注入

Python 防止Windows上的外壳注入,python,security,shell,subprocess,Python,Security,Shell,Subprocess,这样安全吗 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

这样安全吗

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注入攻击的可能性?

如果您使用来自不受信任源的未初始化文本作为命令,则在shell中执行命令容易受到注入攻击。只有当程序运行的权限超过用户通常拥有的权限时,这才是一个问题


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

不,在您的情况下仍然会发生shell注入: 剪贴板('hello;RMDIR/S/Q C:\') 这会将“hello”放入剪贴板,但执行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): ...

“shell等于真的……现在怎么办?”代表一些用户输入吗?我正试图使用
shlex
Popen
,正如文档所示。我没有想到使用
shlex
来验证参数计数。这很实用,也很容易理解。谢谢