Python3 shlex.quote()安全吗?

时间:2018-03-30 11:46:49

标签: bash python-3.x security escaping

我使用

在shell中执行一些代码
subprocess.Popen('echo '+user_string+' | pipe to some string manipulation tools',
    shell=True)

其中user_string来自不受信任的来源。

使用shlex.quote()来逃避输入是否足够安全?

2 个答案:

答案 0 :(得分:2)

我对此不屑一顾,因为它是Google所称“ shlex.quote()安全”最受关注的,虽然公认的答案似乎是正确的,但仍有很多陷阱要指出。

shlex.quote()会转义外壳程序的解析,但不会转义您正在调用的命令的参数解析器,并且某些其他特定于工具的转义需要手动完成,特别是如果您的字符串以破折号开头(-)。

大多数(但不是全部)工具接受--作为参数,之后的所有内容都被逐字解释。如果字符串以"-- "开头,则可以加上"-"。示例:rm -- --help删除名为--help的文件。

在处理文件名时,如果字符串以"./""-"开头,则可以在rm ./--help之前加上前缀。

在您使用echo的示例中,两种转义都不足以:在尝试回显字符串-e时,echo -- -e给出错误的结果,您将需要类似{ {1}}。这表明没有通用的防弹方法可以逃避程序参数。

最安全的方法是通过避免 echo -e \x2deshell=True(如果该字符串涉及用户提供的任何数据)来绕过外壳程序。

根据您的情况,设置os.system()并将stdin=subprocess.PIPE作为参数传递给user_string。然后,您甚至可以使用communicate()保留原来的调用:

shell=True

答案 1 :(得分:1)

根据shlex.quote shlex.quote,答案是肯定的。

当然,这也取决于你的意思"足够安全"。假设您的意思是"是否会user_string使用UserControl来防范我作为字符串输入传递给我的脚本的恶意shell代码的典型情况?"答案是肯定的。