我正在开发一个项目,用户必须能够提交包含占位符的模板,以便稍后渲染以生成动态内容。
例如,用户可能会提交如下模板:
"${item.price} - {item.description} / {item.release_date}"
这将是用实际值格式化后的结果。
为此目的使用模板引擎(如 Django 或 Jinja)需要进行大量验证和清理以防止 SSTI 和 XSS,所以我想知道是否可以使用 python str.format 方法来创建更有限和更安全的替代方案,因为此方法不能直接执行 python 代码(我相信)。
我的问题是:
在处理用户提交的模板时使用 string.format 是否足够安全,或者仍然容易受到注入攻击?
如果不是,有没有其他方法可以在 python 中实现“安全模板渲染”?
否,将
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()))