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
来验证参数计数。这很实用,也很容易理解。谢谢