代码之家  ›  专栏  ›  技术社区  ›  G. Bittencourt

在服务器端对用户提交的模板使用python str.format方法安全吗?

  •  0
  • G. Bittencourt  · 技术社区  · 3 年前

    我正在进行一个项目,用户必须能够提交包含占位符的模板,以便稍后呈现以生成动态内容。

    例如,用户可能会提交如下模板:

    "${item.price} - {item.description} / {item.release_date}"

    这将在用实际值格式化之后进行。

    为此目的使用模板引擎(如Django或Jinja)需要大量的验证和清理才能防止SSTI和XSS,所以我想知道是否可以使用python str.format 方法来创建一个更有限、更安全的替代方法,因为这个方法不能直接执行python代码(我相信)。

    我的问题是:

    在处理用户提交的模板时,使用string.format是否足够安全,或者它仍然容易受到注入攻击?
    如果不是,有没有其他选择可以在python中实现“安全模板渲染”?

    0 回复  |  直到 3 年前
        1
  •  5
  •   Brian61354270    3 年前

    ,通常使用不安全 str.format 具有用户提供的格式字符串。

    我突然想到了这个玩具的例子 str.format 使用精心构建的格式字符串可以很容易地从服务器泄露敏感信息。也可能存在其他攻击向量。

    此攻击仅依赖于攻击者知道(或猜测)提供给的参数的类型 str.format .

    运行此代码将打印服务器上定义的所有环境变量:

    import os
    
    class Foo:
        def foo(self):
            pass
    
    user_format = "{f.foo.__globals__[os].environ}"
    print(user_format.format(f=Foo()))
    

    特定于Django,此格式字符串将打印您的整个设置模块,包括您的DB密码、签名密钥和各种其他可利用信息:

    user_format = "{f.foo.__globals__[sys].modules[myapp.settings].__dict__}"