Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision d38c6c0e

Von Sven Schöling vor mehr als 8 Jahren hinzugefügt

  • ID d38c6c0ef8b306bfd1a5542649b07f738954833d
  • Vorgänger 9227f81d
  • Nachfolger f8f23e03

Sicherheit: ReDoS in trim() umgehen.

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

Unterschiede anzeigen:

SL/Util.pm
33 33

  
34 34
sub trim {
35 35
  my $value = shift;
36
  $value    =~ s{^ \p{WSpace}+ | \p{WSpace}+ $}{}xg if defined($value);
36
  $value    =~ s{^ \p{WSpace}+ }{}xg if defined($value);
37
  $value    =~ s{ \p{WSpace}+ $}{}xg if defined($value);
37 38
  return $value;
38 39
}
39 40

  

Auch abrufbar als: Unified diff