str.split()容易受到拒绝服务攻击吗?

问题描述 投票:0回答:1

我有一个 base64 uri,我想从 POST 请求中捕获和处理它:

def post(self, request, *args, **kwargs):

    image_data = request.POST.get('signature_base64', None)
    imgformat, imgstr = image_data.split(';base64,')

但是,我的代码 linter (SonarCloud) 将此标记为可能暴露为 DoS 攻击。

正则表达式的执行时间可能呈指数级,具体取决于 关于模式和输入字符串的长度。下面的例子, 例如,可能导致应用程序拒绝服务:

模式:

/(a+)+b/
输入字符串:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacb

建议:修复使用 CPU 密集型功能的硬编码正则表达式模式 (如果可能的话,避免捕获、嵌套量词和反向引用, 例如将上面的模式替换为 (/a+b/))。当正则表达式 模式是用用户控制的输入定义的,最后一个应该是 清理以转义常规字符的一部分 表达式语法。

我不确定如何防止这种情况发生。 linter 正确吗?在这种情况下,最佳实践是什么?

python-3.x django regex sonarqube sonarlint
1个回答
0
投票

把正则表达式放在一边,

split()
本身在以下情况下具有潜在的拒绝攻击:

user_input = ';string;with;many;parts;;;;;;;;;;'

for part in user_input.split(';'):
    # many iterations
    # eats a lot of CPU resources

一种解决方案是使用

maxsplit
参数来限制分割,这会限制迭代次数。或者每次迭代都应用
sleep

© www.soinside.com 2019 - 2024. All rights reserved.