具有前瞻性的 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
匹配,除非他后面跟着 a
或 j
。然后他很怀疑,所以我们继续下一条规则。如果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 正则表达式问题的主要内容,如果未能解决你的问题,请参考以下文章