]> wagnertech.de Git - kivitendo-erp.git/commitdiff
Sicherheit: ReDoS in trim() umgehen.
authorSven Schöling <s.schoeling@linet-services.de>
Thu, 21 Jul 2016 09:23:35 +0000 (11:23 +0200)
committerSven Schöling <s.schoeling@linet-services.de>
Thu, 21 Jul 2016 09:23:35 +0000 (11:23 +0200)
trim hat bisher whitespace mit dem regex /^\p{WSpace}+|\p{WSpace}+$/
getrimmt. Der ist aber anfällig gegen große Mengen Whitespace in der
Mitte, weil dann das Backtracking in O(n²) läuft:

$_ = "--".(" "x200000)."and more"; s/^\p{WSpace}+|\p{WSpace}+$//;
-> 0m16.572s

Für genau den Fall hat die Perl Engine aber Optimierungen, die bei
Regexes die rechts geankert sind einfach von hinten sucht. Die
funktionieren aber nur wenn einzeln gesucht wird. Also sind das jetzt
zwei separate Regexes.

$_ = "--".(" "x200000)."and more"; s/^\p{WSpace}+//; s/\p{WSpace}+$//;
-> 0m0.022s

SL/Util.pm

index 9022d939b7b2d60592fb49c13bb380f14e4ca675..bf2e9ff41050d7c728b0b296bbe0dbbb90661b2d 100644 (file)
@@ -33,7 +33,8 @@ sub snakify {
 
 sub trim {
   my $value = shift;
-  $value    =~ s{^ \p{WSpace}+ | \p{WSpace}+ $}{}xg if defined($value);
+  $value    =~ s{^ \p{WSpace}+ }{}xg if defined($value);
+  $value    =~ s{ \p{WSpace}+ $}{}xg if defined($value);
   return $value;
 }