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

问题描述 投票:0回答:1

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

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

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

这将是用实际值格式化后的结果。

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

我的问题是:

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

python security xss template-engine
1个回答
1
投票

,将

str.format
与用户提供的格式字符串一起使用通常并不安全。

我突然想出了这个玩具示例,说明如何使用精心构造的格式字符串来轻松从服务器泄漏敏感信息。其他攻击媒介也可能存在。

此攻击仅依赖于攻击者了解(或猜测)提供给 

str.format

的参数类型,并能够猜测包含

str.format
调用的模块中哪些其他对象可用作全局变量。
运行此代码将打印服务器上定义的所有环境变量:

str.format

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

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

© www.soinside.com 2019 - 2024. All rights reserved.