Ich und ihr könnt hier mal ein paar Beispiele für Regexe posten, die eine Falle werden können.
Ein Beispiel, das in einer Webanwendung (Download-CGI) lief und auch bei normalen URLs klappte.
gekürzt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
my $dir = "/var/www/mydom.de/htdcos";
use CGI qw/:all/;
my $p = path_info;
$filename= "$dir/$p";
$res = "";
if ($filename =~ m{$p\.png}) {
$res = "OK";
} else {
$res = "NOT OK!!!";
}
print header;
print "Upload is ", $res;
Alles klar, denken manche. Sieht doch normal aus.
Aber wehe die URL wird als
http://example.org/cgi-bin/dl.pl/..++++a.png oder
http://example.org/cgi-bin/dl.pl/a[].png aufgerufen, dann kracht es wie ein Serverlog zeigte:
[Thu Feb 13 11:01:30 2012] [error] [client 127.0.0.1] Nested quantifiers in regex; marked by <-- HERE in m//..+++ <-- HERE +a.png\\.png/ at dl.pl line 18.
[Thu Feb 13 11:01:30 2012] [error] [client 127.0.0.1] Premature end of script headers: dl.pl
Und der Server nörgelt mit einem 500er. Logisch.
Dabei wäre es einfach gewesen, das Regex so zu verwenden:
if ($filename =~ m{\Q$p\E\.png}) {
Wenn ihr auch so ein paar Fallen habt, nur auch posten. Dann stürzen die nächsten Anfänger nicht drüber. ;)
//EDIT: Vielleicht auch gut, das ins Wiki zu setzen? Falls sowas nicht schon vorhanden ist.
Last edited: 2012-02-23 13:22:51 +0100 (CET)