具有前瞻性的 AWS WAF 正则表达式问题

Posted

技术标签:

【中文标题】具有前瞻性的 AWS WAF 正则表达式问题【英文标题】:AWS WAF Regexp issue with lookahead 【发布时间】:2020-01-17 08:34:08 【问题描述】:

我正在使用负前瞻为 AWS WAF 构建正则表达式。

joe(?!(ann|jen))

但是,我从 WAF 控制台返回了以下错误

WAFInvalidParameterException: Error reason: The parameter contains formatting that is not valid., field: REGEX_PATTERN_SET, parameter: joe(?!(ann|jen))

AWS WAF 似乎不支持这种正则表达式。我找到了这个博客 https://aws.amazon.com/about-aws/whats-new/2017/10/aws-waf-now-supports-regular-expressions-regex/

有没有人有类似的问题?可以分享一下解决方法吗?

【问题讨论】:

joe?!(ann|jen) 没有前瞻。 e 是可选的 ? 量词。你有joe(?!ann|jen)吗? 是的。我有这个 joe(?!ann|jen)。谢谢指正 文档是very unhelpful。他们说引擎是 PCRE,但似乎只启用了 POSIX 函数作为任意零宽度断言,并且基本上不支持所有很酷的功能。 您确定需要带有负前瞻的正则表达式吗? where col LIKE '%joe%' and col NOT LIKE '%joeann%' and col NOT LIKE '%joejen%' 之类的呢? @WiktorStribiżew WAF 不会在任何地方使用 SQL 语法,并且它们不允许您组合否定和肯定规则。您可以匹配所有规则或不匹配任何规则。 【参考方案1】:

由于不支持负前瞻,我将其分解为涵盖所有情况的几个表达式。 WAF 允许您指定多个表达式。它使用逻辑或匹配,因此只有其中一个必须匹配。使用问题中的示例,解决方案可能是......

joe[^aj]
joea[^n]
joean[^n]
joej[^e]
joeje[^n]

joe 匹配,除非他后面跟着 aj。然后他很怀疑,所以我们继续下一条规则。如果a 后面跟着n,我们仍然怀疑,所以我们继续下一条规则。我们重复这个过程,直到我们确定整个单词是joeann 还是joejen


我的特殊用例是 URI 匹配。我想限制对整个目录的请求,除了一个子目录(及其所有子目录)。

假设我们想要限制 /my/dir,但不想限制 /my/dir/safe 中的任何内容。我们会这样做......

^/my/dir/?$
^/my/dir/[^s]
^/my/dir/s[^a]
^/my/dir/sa[^f]
^/my/dir/saf[^e]
^/my/dir/safe[^/]

我们遵循相同的过程来按顺序识别每个字母。

“你不能以 S 开头。好吧,你可以以 S 开头,但你不能也有一个 A。好吧好吧,我让它滑动,但你不能也有一个 F。好吧,你的坚持,但是……”

请注意,我们必须为尾部斜杠 / 添加一条规则。这涵盖了/my/dir/safe/ 和所有子目录(例如/my/dir/safe/whatever)中的可选斜杠。

【讨论】:

以上是关于具有前瞻性的 AWS WAF 正则表达式问题的主要内容,如果未能解决你的问题,请参考以下文章

sed:具有反向前瞻匹配的嵌套组

负前瞻正则表达式贪婪(为啥.*?太贪婪)

正则表达式创建 AWS Athena 表 (RegexSerDe)

Java 正则表达式:负前瞻

负前瞻正则表达式

[正则]前瞻