我们在具有IIS的Windows 2016服务器上运行ColdFusion 2018。
作为例行维护的一部分,我们于2020年1月16日重启了Windows服务器。第二天,当用户在表单数据中发布长字符串(约2500个字符)时,我们开始看到孤立的堆栈溢出错误。重新启动似乎无关紧要,但这是我们环境中唯一的最新更改。用户多年来已经成功提交了长度等于或大于长度的数据。
这是错误:
java.lang.StackOverflowError
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提供的2016 Adobe链接(reReplaceNoCase抛出java.lang.StackOverflowError)对正则表达式如何导致堆栈意外溢出提供了两种解释。
Windows,CF和RegEx引擎与该问题无关。堆栈大小是主要变量。Adobe提供的解决方案是“增加jvm.config中Xss属性的值或改善您的正则表达式模式”。我们的解决方案是将“ useJavaAsRegexEngine”属性设置为true。无论出于何种原因,Java引擎都会更高效地解析我们正在使用的正则表达式。