我有一个 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 正确吗?在这种情况下,最佳实践是什么?
把正则表达式放在一边,
split()
本身在以下情况下具有潜在的拒绝攻击:
user_input = ';string;with;many;parts;;;;;;;;;;'
for part in user_input.split(';'):
# many iterations
# eats a lot of CPU resources
一种解决方案是使用
maxsplit
参数来限制分割,这会限制迭代次数。或者每次迭代都应用 sleep
。