gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:08:01 27 4
gpt4 key购买 nike

我正在开发一个网络应用程序,用户可以在其中提供字符串,然后服务器会将变量替换到这些字符串中。

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

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

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

我的假设是:

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

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


编辑:Armin Ronacher 概述了如果不过滤掉 dunder 变量访问会导致严重的信息泄漏,但似乎认为保护 format() 是可行的:

{local_foo.__init__.__globals__[secret_global]}

Be Careful with Python's New-Style String Format | Armin Ronacher's Thoughts and Writings

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

最佳答案

良好的直觉。是的,能够提供任意格式字符串的攻击者是 python 下的一个漏洞。

  • 拒绝服务可能是最容易解决的问题。在在这种情况下,限制字符串的大小或运算符的数量在字符串中将缓解此问题。应该有一个设置合理的用户不需要生成字符串比 X 更多的变量,并且这个计算量没有风险在 DoS 攻击中被利用。
  • 能够访问对象内的属性可能很危险。但是,我认为 Object 父类没有任何用处信息。提供给格式的对象必须包含敏感的东西。无论如何,这种类型的符号可以限制使用正则表达式
  • 如果格式字符串是用户提供的,那么用户可能需要知道调试的错误信息。但是,错误消息可以包含敏感信息,例如本地路径或类名。制作一定要限制攻击者可以获得的信息。

查看python format string specification并禁止您不希望用户使用正则表达式的功能。

关于python - Python 的 string .format() 可以安全地用于不受信任的格式字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15356649/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com