>>> import sys
>>> sys.set_int_max_str_digits(4300)  # Illustrative, this is the default.
>>> _ = int('2' * 5432)
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300) for integer string conversion: value has 5432 digits.

Python3.10.7为类型转换引入了这一突破性的变化.

文档:Integer string conversion length limitation

其实我也不明白为什么

  1. 这一点被引入并
  2. 4300这个缺省值从何而来?这听起来像是一个随意的数字.

推荐答案

请参阅GitHub第CVE-2020-10735: Prevent DoS by large int<->str conversions #95778期:

Problem

在CPython中发现了一个拒绝服务(DoS)问题 因为我们在int实现中使用了二进制bignum.一个巨大的 Integer将始终消耗接近二次的CPU时间 转换为具有大数字的基数为10(十进制)的字符串或从基数为10(十进制)的字符串进行转换 数位数.没有其他有效的算法可以做到这一点.

对于实现网络协议和 对输入执行INT(UNTRUSTED_STRING_OR_BYTES_VALUE)的数据序列化 在不限制输入长度或的情况下获取数值 执行log("processing thing id %s", unknowingly_huge_integer)或任何操作 类似于无需首先判断即可将int转换为字符串的概念 它的规模.(httpjsonxmlrpclogging,将大值加载到 通过线性时间转换实现的整数,例如存储在 YAML或任何基于用户控制的计算较大值的对象 输入…然后最终try 在稍后输出为小数). 所有这些都可能在不可信的情况下遭受CPU消耗的DoS 数据.

每个人都在为此审核所有现有代码,添加长度保护, 坚持这种做法无处不在是不可行的,也是不可能的 我们认为绝大多数用户想要做的事情.

此问题已报告给Python安全响应团队 自2020年初以来,由几个不同的人多次提出,大多数 最近几周前,当我正在打磨 PR,所以它会在3.11.0rc2之前准备好.

Mitigation

在讨论了Python安全响应团队之后 邮寄列表结论是,我们需要限制 用于非线性时间转换的整数到字符串的转换 (默认情况下,不是2的幂).并提供了以下能力 配置或禁用此限制.

Python指导委员会意识到了这一变化,并将其视为 这是必要的.

更多的讨论可以在开发人员讨论主题Int/str conversions broken in latest Python bugfix releases上找到.

我发现史蒂夫·道尔的this comment本书信息量很大:

我们对这一过程缺乏透明度表示歉意.这个 这个问题最先报告给了其他一些安全团队, 汇聚在Python安全响应团队,在那里我们达成了一致 正确的修复方法是修改运行时.

报告和修复之间的延误完全是我们的错.安全措施 团队由志愿者组成,我们的可用性并不总是可靠的, 也没有人"负责"协调工作.我们一直在 讨论如何改进我们的流程.然而,我们确实同意 剥削的可能性很高,以至于我们不想 在没有可用的修复程序并可供使用的情况下披露该问题.

我们确实通过许多替代方法进行了工作,实现 他们中的许多人.执行INT(GIGABYTE_LONG_UNTRUSTED_STRING)的代码可能 位于json.Load或HTTP头解析器中的任何位置,并且可以非常 很深.解析库无处不在,并且倾向于使用int 不加区别地(尽管它们通常已经处理了ValueError). 期望每个库都向每个int()调用添加一个新参数 会导致数以千计的漏洞被归档,并 用户永远不可能相信他们的系统不能 多斯德.

我们同意在核心做这件事是一把沉重的锤子,但这也是 只有锤子有机会让用户有信心保持 在他们的应用程序边界上运行Python.

现在,我个人倾向于同意int->字符串转换应该 做一些不同于加薪的事情.我被击败了,因为它会打破 往返,这是我接受的一个合理的论点.我们可以的 不过,随着时间的推移,仍然会改进这一点,使其更易于使用.然而,在大多数情况下 我们看到的 case 中,渲染过长的字符串是不可取的 两种都行.这应该是 Select 加入的行为.

从str引发异常可能会被证明是太多了,而且可能是 重新考虑,但我们没有看到一种可行的方法来推送更新 INT的每一个用户,所以这肯定会保持全球性.

Python相关问答推荐

如何从. text中进行pip安装跳过无法访问的库

如何使用函数正确索引收件箱?

Flask:如何在完整路由代码执行之前返回验证

在Docker中运行HAProxy时无法获得503服务

如何编写一个正规表达式来查找序列中具有2个或更多相同辅音的所有单词

使用Python和PRNG(不是梅森龙卷风)有效地生成伪随机浮点数在[0,1)中均匀?

如果AST请求默认受csref保护,那么在Django中使用@ system_decorator(csref_protect)的目的是什么?

Tkinter滑动条标签.我不确定如何删除滑动块标签或更改其文本

将行从一个DF添加到另一个DF

Python中的函数中是否有充分的理由接受float而不接受int?

查找两极rame中组之间的所有差异

删除所有列值,但判断是否存在任何二元组

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

通过pandas向每个非空单元格添加子字符串

如何在给定的条件下使numpy数组的计算速度最快?

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

如何保持服务器发送的事件连接活动?

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

使用Python从rotowire中抓取MLB每日阵容