ColdFusion 的 RegEx 引擎最近的行为变化?

Recent behavior changes in ColdFusion's RegEx engine?

我们 运行 ColdFusion 2018 在带有 IIS 的 Windows 2016 服务器上。

作为例行维护的一部分,我们于 2020 年 1 月 16 日重新启动了 Windows 服务器。第二天,当用户在表单数据中发布长字符串(~2500 个字符)时,我们开始看到孤立的堆栈溢出错误。重新启动似乎无关紧要,但却是我们环境中最近发生的唯一变化。多年来,用户已成功提交长度等于或大于的数据。

这是错误:

java.lang.WhosebugError 
at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source) 
at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source) 
at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source) 
[Repeats many more times....]

错误源于下面代码的 "REFindNoCase" 行,它检查来自提交表单的恶意输入。

var failedTest = false;
var doZealousTesting = true;
var badTagsAndEvents = "SCRIPT|OBJECT|APPLET|EMBED|FORM|LAYER|ILAYER|FRAME|IFRAME|FRAMESET|HREF|SRC|PARAM|META|onClick|onDblClick|onKeyDown|onKeyPress|onKeyUp|onMouseDown|onMouseOut|onMouseUp|onMouseOver|onBlur|onChange|onFocus|onSelect|javascript";
var zealousRegex = "((\%3C)|<)(.)+((\%3E)|>)";
var conservativeRegex = "((\%3C)|<)(.)*(#badTagsAndEvents#)+(.)*((\%3E)|>)";
var regexTest = iif(doZealousTesting,de(zealousRegex),de(conservativeRegex));
for (key in form) {
  failedTest = (failedTest or REFindNoCase(regexTest,left(form[key],3999)) neq 0);
} 

我们是否遗漏了代码的某些固有问题?

(顺便说一下,我们可以通过将 ColdFusion 的 "useJavaAsRegexEngine" 标志设置为 true 来消除错误。)

@DWR (reReplaceNoCase is throwing a java.lang.WhosebugError) 给出的 2016 Adob​​e link 对正则表达式如何导致堆栈意外溢出提供了两种解释。

  1. jvm 版本的变化(可能与 #2 相关)
  2. -Xss 属性 重置为太小的值

Windows、CF 和 RegEx 引擎与该问题无关。筹码量是发挥作用的主要变量。 Adobe 给出的解决方案是 "increase the value of the Xss property in jvm.config or improve your regex pattern." 我们的解决方案是将 "useJavaAsRegexEngine" 属性 设置为 true。无论出于何种原因,Java 引擎可以更有效地解析我们使用的正则表达式。