python - 在服务器端将 python str.format 方法与用户提交的模板一起使用是否安全?

标签 python security xss template-engine

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

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

“${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/

相关文章:

java - 在 SSL 套接字工厂连接中使用多个 key 对

python - 附加到关联数组

Python 开关函数

php - 保护必须写入数据库的输入的步骤?

php - 防止对用户在 PHP 中提交的 HTML 内容进行 XSS 攻击,eBay 方式

java - 如何修复 ServletOutputStream 中的 "Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS)"

security - 如果参数 echo'd 从 GET 更改为 POST,可以使用哪些方法来利用 XSS?

python - 使用字典值创建字典

python - 类似于 python 的 sorted(),按键对 pandas 数据框中的值进行排序

android - 如何在 android volley 中使用 ssl 时提高安全性