• Bewerte uns auf OMR Reviews: Klick

  • Achtet bitte in den Beiträgen darauf, dass ihr keine Informationen teilt, die der DSGVO unterliegen können. Verpixelt bitte die entsprechenden Stellen in Screenshots, postet hier auf keinen Fall Messagatracks ohne Rücksprache und auch in den Log Files können persönliche oder sensible Daten enthalten sein.

    Macht uns auch bitte per PN darauf aufmerksam wenn ihr etwas seht. Schreibt mich (@sören) einfach direkt an. 

Wortfilter - RegEx Engine Timeout

Patrick

Member
Hallo zusammen,

wir haben bei uns ein paar Wortfilter im Einsatz, darunter auch einen RegEx-Filter. Diesen verwenden wir, um bei Bedarf gezielt Nachrichten mit einem bestimmten Betreff abzulehnen. Insbesondere die Möglichkeit, mit RegEx den Beginn und das Ende eines Strings zu matchen ist dabei sehr hilfreich.

Der Filter enthält Einträge wie die folgenden:

Code:
^Ihre Rechnungsnummer \d{10}$
^Kredit$

Wir hatten in der Vergangenheit auch (temporär) komplexere Filter, allerdings immer ohne Backtracking o.ä.
Nun kommt es sehr oft vor, dass bei Nachrichten im Wortfilter folgende Fehlermeldung erscheint:

Code:
The RegEx engine has timed out while trying to match a pattern to an input string. This can occur for many reasons, including very large inputs or excessive backtracking caused by nested quantifiers, back-references and other factors.
   at System.Text.RegularExpressions.RegexRunner.DoCheckTimeout()
   at System.Text.RegularExpressions.RegexInterpreter.Go()
   at System.Text.RegularExpressions.RegexRunner.Scan(Regex regex, String text, Int32 textbeg, Int32 textend, Int32 textstart, Int32 prevlen, Boolean quick, TimeSpan timeout)
   at System.Text.RegularExpressions.Regex.Run(Boolean quick, Int32 prevlen, String input, Int32 beginning, Int32 length, Int32 startat)
   at System.Text.RegularExpressions.MatchCollection.GetMatch(Int32 i)
   at System.Text.RegularExpressions.MatchEnumerator.MoveNext()
   at System.Linq.Enumerable.<CastIterator>d__97`1.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Netatwork.NoSpamProxy.Addins.Core.Filter.ExpressionEngine.CheckString(String input, IDictionary`2 matchedWords, WordMatchLocations location, CancellationToken cancellationToken)
   at Netatwork.NoSpamProxy.Addins.Core.Filter.WordFilter.<ExecuteAsync>d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Netatwork.NoSpamProxy.MailValidation.MailValidator.<ExecuteFilterAsync>d__101.MoveNext()


Zuletzt z.B. bei einem Newsletter von Xing mit dem Betreff "IW-Studie: So würden die Bürger das Rentensystem retten"
Allein in der letzten Stunde haben wir 100 Nachrichten, bei denen der Filter in einen Timeout lief.

Wie erwähnt greift der RegEx-Wortfilter lediglich auf den Betreff, der nun in diesem Beispiel nicht sehr komplex ist und ich denke mal auch nicht als "large input" gelten sollte.

Konkrete Fragen:
  • Wird der Filter trotz der "Subject"-Einschränkung auch auf den Inhalt der Nachricht zumindest ausgeführt, ohne dass Treffer tatsächlich zählen?
  • Werden bei diesem Timeout die anderen Wortfilter auch nicht angewandt?

Falls das hier auch mal jemand prüfen möchte, folgender Einzeiler zeigt die Anzahl der RegEx engine timeouts der letzten Stunde an:

Code:
((Get-NspMessageTrack -Age (New-TimeSpan -Hours 1) -WithFilters -Directions FromExternal).filters | Where-Object {$_.Name -eq "wordFilter" -and $_.ErrorMessage -like "*RegEx engine has timed out*"}).count

Danke und viele Grüße,
Patrick

PS: Mir fällt gerade auf, dass bei dem Forums-Code-Makro kein PowerShell als Sprachauswahl zur Verfügung steht. ;)
 
Zurück
Oben