小编Cra*_*any的帖子

Python的字符串.format()可以安全地用于不受信任的格式字符串吗?

我正在开发一个Web应用程序,用户可以在其中提供服务器然后将变量替换为的字符串.

我最好使用PEP 3101 format()语法,我正在研究在Formatter中覆盖方法的可行性,以使其对不受信任的输入安全.

以下是我可以看到的.format()风险:

  • 填充允许您指定任意长度,因此'{:> 9999999999}'.format(..)可以使服务器内存不足并成为DOS.我需要禁用它.
  • 格式允许您访问对象内部的字段,这很有用,但令人毛骨悚然的是,您可以访问dunder变量并开始钻取到标准库的位.没有人知道哪里可能有getattr()有副作用或返回秘密.我会通过覆盖get_field()将属性/索引访问列入白名单.
  • 我自然需要抓住一些例外.

我的假设是:

  • 传统的C格式字符串漏洞都不适用于Python,因为指定参数是对集合的边界检查访问,而不是直接弹出线程的堆栈.
  • 我正在使用的Web框架转义了每个被替换为页面模板的变量,只要它是输出之前的最后一个停止,我就可以避免因转义中出现的跨站点脚本攻击.

你的想法是什么?可能?不可能?真的不明智?


编辑:如果你没有过滤掉dunder变量访问,Armin Ronacher概述了一个令人讨厌的信息泄漏,但似乎认为安全格式()是可行的:

{local_foo.__init__.__globals__[secret_global]}

http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/

(就个人而言,我实际上并没有在我的产品中使用不受信任的format()路由,但为了完整性而更新)

python security

15
推荐指数
1
解决办法
3381
查看次数

标签 统计

python ×1

security ×1