【问题标题】:How do I pass user-input filenames to ImageMagick safely?如何安全地将用户输入的文件名传递给 ImageMagick?
【发布时间】:2021-04-20 05:24:07
【问题描述】:

我正在使用 Python 生成 ImageMagick bash 命令。类似的东西

import subprocess

input_file = "hello.png"
output_file = "world.jpg"

subprocess.run(["convert", input_file, output_file])

input_fileoutput_file 之前可能有更多参数。我的问题是,如果其中一个文件名是用户提供的,并且用户提供了一个可以解析为 ImageMagick 的命令行选项的文件名,那不是不安全吗?

【问题讨论】:

    标签: python bash imagemagick


    【解决方案1】:

    如果文件名以破折号开头,ImageMagick 确实可以认为这是一个选项而不是文件名。大多数程序(包括 AFIK 和 ImageMagick 命令行工具)都遵循双破折号 (--) 表示选项结束的约定。如果你做一个

    subprocess.run(["convert", "--", input_file, output_file])
    

    在这方面你应该是安全的。

    【讨论】:

    • 不能保护您免受 IM 选项的影响。 convert -- Foo.jpg -scale 会抱怨缺少 -scale 选项。在那种情况下没有什么危险,但可能存在极端情况。
    • @xenoid :否 - 垃圾输入/垃圾输出。如果用户以这种方式传递命令,他显然会将-scale 视为文件名,并且如果您知道需要 -scale 选项,则必须在@ 之前显式传递它987654327@.
    【解决方案2】:

    man 页面(和一些测试)中,convert 需要一个输入文件和一个输出文件。如果您只允许两个标记,并且如果一个文件名被解释为一个选项,那么convert 将至少丢失一个文件,因此您会收到一条丑陋的消息,但应该没问题。

    否则,您可以在任何以- 开头的文件名前加上./- 本身除外,它是标准输入或标准输出,具体取决于位置),以便它成为同一文件的明确文件路径。

    【讨论】:

    • 理想情况下,我不想告诉用户我无法处理他们的文件名,从而让他们感到惊讶。我认为另一件事是只传递绝对文件路径。
    • 是的,在每个文件上调用os.path.abspath(path) 也是一种解决方案。但是单个- 表示标准输入或标准输出,所以不能盲目转换为绝对路径。
    • 在我的情况下,文件路径由用户以他们上传到我的网站的文件的形式提供,用户没有指定命令行参数。
    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2011-09-13
    • 2012-10-22
    • 2012-12-13
    • 2011-09-14
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多