温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - Recent behavior changes in ColdFusion's RegEx engine?
coldfusion java windows-server-2016

java - ColdFusion的RegEx引擎最近的行为更改?

发布于 2020-05-01 16:04:00

我们在具有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来消除错误。)

查看更多

提问者
bwhet
被浏览
54
bwhet 2020-02-12 21:59

@DWR提供的2016 Adob​​e链接(reReplaceNoCase抛出java.lang.StackOverflowError)对正则表达式如何导致堆栈意外溢出提供了两种解释。

  1. 更改jvm版本(可能与w /#2结合使用)
  2. -Xss属性重置为太小的值

Windows,CF和RegEx引擎与该问题无关。堆栈大小是主要变量。Adobe提供的解决方案是“增加jvm.config中Xss属性的值或改善您的正则表达式模式”。我们的解决方案是将“ useJavaAsRegexEngine”属性设置为true。无论出于何种原因,Java引擎都会更高效地解析我们正在使用的正则表达式。