我正在开发一个项目,用户必须能够提交包含占位符的模板,以便稍后呈现以生成动态内容。
例如,用户可能会提交如下模板:
“${item.price} - {item.description}/{item.release_date}”
这将是用实际值格式化后的结果。
为此目的使用模板引擎(如 Django 或 Jinja)需要进行大量验证和清理以防止 SSTI 和 XSS,所以我想知道是否可以使用 python str.format方法来创建更有限且更安全的替代方案,因为此方法无法直接执行 python 代码(我相信)。
我的问题是:
在处理用户提交的模板时使用 string.format 是否足够安全,或者仍然容易受到注入(inject)攻击?
如果不是,是否有其他方法可以在 python 中实现“安全模板渲染”?
最佳答案
否,将 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,此格式字符串将打印您的整个设置模块,包括您的数据库密码、签名 key 以及各种其他可利用信息:
user_format = "{f.foo.__globals__[sys].modules[myapp.settings].__dict__}"
关于python - 在服务器端将 python str.format 方法与用户提交的模板一起使用是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76783239/