我正在开发一个网络应用程序,用户将能够提供服务器然后将变量替换为的字符串。
最好我想使用PEP 3101 format()
语法,并且我正在研究覆盖方法的可行性,Formatter
以使其对不受信任的输入安全。
以下是我可以看到的风险.format()
:
- 填充可让您指定任意长度,因此
'{:>9999999999}'.format(..)
可能会使服务器内存不足并成为 DOS。我需要禁用它。 - Format 允许您访问对象内部的字段,这很有用,但令人毛骨悚然的是您可以访问 dunder 变量并开始钻研标准库的一些内容。不知道哪里可能
getattr()
有副作用或返回一些秘密。我会通过覆盖将属性/索引访问列入白名单get_field()
。 - 自然,我需要捕获一些异常。
我的假设是:
- 传统的 C 格式字符串漏洞都不适用于 Python,因为指定参数是对集合的边界检查访问,而不是直接从线程的堆栈中弹出。
- 我正在使用的 Web 框架转义了替换到页面模板中的每个变量,只要它是输出前的最后一站,我就可以安全地避免因反转义而出现的跨站点脚本攻击。
你觉得呢?你有没有什么想法?可能的?不可能的?只是不明智?
编辑:如果您不过滤掉 dunder 变量访问,Armin Ronacher 概述了一个令人讨厌的信息泄漏,但似乎认为安全format()
是可行的:
{local_foo.__init__.__globals__[secret_global]}
小心 Python 的新型字符串格式 阿明·罗纳赫的思想和著作
就个人而言,我实际上并没有format()
在我的产品中走不受信任的路线,而是为了完整性而进行更新