Dat*_*ery 18 python python-3.x python-3.10
Run Code Online (Sandbox Code Playgroud)>>> 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.
Python 3.10.7 引入了类型转换的这一重大更改。
文档:整数字符串转换长度限制
其实我不明白为什么
Pal*_*ine 12
如果您收到此错误:
ValueError: Exceeds the limit (4300) for integer string conversion
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式增加限制:
import sys
sys.set_int_max_str_digits(0)
Run Code Online (Sandbox Code Playgroud)
现在,您可以进行更大的计算。
文档链接:
https://docs.python.org/3/library/stdtypes.html#integer-string-conversion-length-limitation
请参阅 github 问题CVE-2020-10735:通过大型 int<->str 转换防止 DoS #95778:
\n\n\n问题
\n在 CPython 中发现了拒绝服务 (DoS) 问题,因为我们使用二进制 bignum\xe2\x80\x99s 进行 int 实现。在与具有大量数字的以 10 为基数的字符串之间进行转换时,\n巨大的\n整数总是会消耗近乎平方数的 CPU 时间。\n 不存在有效的算法来做到这一点。
\n对于实现网络协议和数据序列化的 Python 代码来说,在输入上执行 int(untrusted_string_or_bytes_value) 来获取数值是很常见的,而无需限制输入长度或使用任何
\nlog("processing thing id %s", unknowingly_huge_integer)类似概念将 int 转换为 a字符串而不首先检查其大小。(http、json、xmlrpc、logging、通过线性时间转换(例如存储在 yaml 中的十六进制)将大值加载到整数中,或者根据用户控制的输入\xe2\x80\xa6 计算较大值的任何内容,然后最终尝试输出为十进制稍后)。\n面对不受信任的数据,\n所有这些都可能会遭受 CPU 消耗型 DoS。每个人都为此审核所有现有代码,添加长度保护,并在各处维持这种做法是不可行的,也不是我们认为绝大多数用户想要做的。
\n自 2020 年初以来,几个不同的人已多次向 Python 安全响应团队报告此问题,最近一次是在几周前,当时我正在完善 PR,所以它\xe2\x80\x99d在3.11.0rc2之前准备好。
\n减轻
\n经过 Python 安全响应团队\n邮件列表的讨论后,得出的结论是,默认情况下,我们需要将非线性时间转换的\n整数转换为字符串\n(任何不是 2 的幂基数)的大小限制。并提供配置或禁用此限制的功能。
\nPython 指导委员会已了解此更改并在必要时接受它。
\n
进一步的讨论可以在 Python 核心开发人员讨论最新 Python 错误修复版本中损坏的线程 Int/str 转换中找到。
\n我发现Steve Dower 的评论内容丰富:
\n\n\n对于此过程缺乏透明度,我们深表歉意。该问题首先报告给了许多其他安全团队,并汇聚到 Python 安全响应团队,我们一致认为正确的修复方法是修改运行时。
\n报告和修复之间的延迟完全是我们的错。安全团队由志愿者组成,我们的可用性并不总是可靠,而且没有人负责协调工作。我们\xe2\x80\x99\n一直在讨论如何改进我们的流程。然而,我们确实同意\n被利用的可能性足够高,\xe2\x80\x99\n我们不想\n在没有可用的修复程序并准备使用的情况下披露该问题。
\n我们确实通过了许多替代方法,并实施了其中的许多方法。执行 int(gigabyte_long_untrusted_string) 的代码可以位于 json.load 或 HTTP 标头解析器内的任何位置,并且可以运行得非常深。解析库无处不在,并且倾向于无差别地使用 int(尽管它们通常已经处理 ValueError)。\n期望每个库都为每个 int() 调用添加一个新参数\n会导致数千个漏洞被归档,并造成\用户不可能相信他们的系统不会\nDoS\xe2\x80\x99d。
\n我们同意它\xe2\x80\x99是在核心中执行此操作的重锤,但它\xe2\x80\x99也是\n唯一有机会让用户有信心在边界上继续运行Python的锤子。他们的应用程序。
\n现在,我个人倾向于同意 int->str 转换应该做一些不同于 raise 的事情。我被否决了,因为它会破坏往返,这是我接受的合理论点。随着时间的推移,我们仍然可以改进它并使其更可用。然而,在我们看到的大多数情况下,渲染过长的字符串都是不可取的。这应该是选择加入的行为。
\n从 str 引发异常可能会被证明太多,并且可以重新考虑,但我们没有看到一种可行的方法来向 int 的每个用户推送更新,因此这肯定会保持全局性。
\n
| 归档时间: |
|
| 查看次数: |
24146 次 |
| 最近记录: |