正则表达式 uuid 验证器对于不受信任的字符串是否安全

Is regex uuid validator is safe for untrusted strings

我正在使用 uuid package 可以验证字符串是否为 UUID。
我害怕ReDOS attacks。这个正则表达式是否暴露于 ReDOS 攻击?也许还有其他我没有想到的攻击?

/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i

目前我在将字符串传递给函数之前对其进行切片,但它很麻烦且可读性差:

const _ = require('lodash');
flow(s => s.slice(0, 36), console.log)('uuid')

具有这种模式的 ReDOS 的可能性为零 — 它不包含任何变量重复,或重复内的任何交替。这是一个非常简单的模式,可以验证每个字符并继续下一个字符。

您链接的 OWASP 文章有您的答案。如果一个模式在重复组中包含重复,则它被认为是“邪恶的”(容易受到 ReDOS 攻击)。

Evil Regexes

A Regex is called “evil” if it can stuck on crafted input.

Evil Regex pattern contains:

  • Grouping with repetition
  • Inside the repeated group:
    • Repetition
    • Alternation with overlapping

您的模式在重复中没有分组,因此不易受攻击。也就是说,如果您知道您希望在要搜索的字符串的前 36 个字符中包含 UUID,则在尝试匹配之前修剪字符串会提高效率。我不知道拼接是否难以阅读以保证额外的时间搜索你的字符串,你必须自己判断。