Последние изменения в поведении движка ColdFusion RegEx? - PullRequest
1 голос
/ 30 января 2020

Мы запускаем ColdFusion 2018 на сервере Windows 2016 с IIS.

Мы перезагрузили сервер Windows 16 января 2020 года в рамках планового обслуживания. На следующий день мы начали видеть изолированные ошибки переполнения стека, когда пользователи публиковали длинные строки (~ 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.)

1 Ответ

0 голосов
/ 12 февраля 2020

Ссылка Adobe на 2016, предоставленная @DWR ( reReplaceNoCase генерирует java .lang.StackOverflowError ), предлагает два объяснения того, как регулярное выражение может вызвать неожиданное переполнение стека.

  1. изменение версии jvm (возможно, в сочетании с # 2)
  2. -Xss свойство сбрасывается при слишком малом значении

Windows, CF и механизм RegEx don не имеет ничего общего с проблемой. Размер стека является основной переменной в игре. Решения, предложенные Adobe, заключались в том, чтобы «увеличить значение свойства Xss в jvm.config или улучшить шаблон регулярных выражений». Нашим решением было установить для свойства «useJavaAsRegexEngine» значение true. По какой-то причине механизм Java анализирует регулярное выражение, которое мы использовали более эффективно.

...