Readers: 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#!/usr/bin/perl use strict; use warnings; use URI; my $myurl = 'http://example.org/a/b/c/d/e/y.html'; print "BasisUrl = $myurl\n\n"; for my $u ( 'http://example.org/x/../../../../../x.htm', '../../../../../x.htm', '../x.htm', '././../././../../x.htm', '././../././../.././../.././../.././../../../x.htm' ) { print "$u = ", URI->new_abs($u, $myurl), "\n"; }
1
2
3
4
5
6
7
BasisUrl = http://example.org/a/b/c/d/e/y.html
http://example.org/x/../../../../../x.htm = http://example.org/x/../../../../../x.htm
../../../../../x.htm = http://example.org/x.htm
../x.htm = http://example.org/a/b/c/d/x.htm
././../././../../x.htm = http://example.org/a/b/x.htm
././../././../.././../.././../.././../../../x.htm = http://example.org/../../../../../x.htm
2010-07-02T14:39:22 pqich denke, bei der letzten url sollten die ../../ verschwunden sein, oder?
Quote$URI::ABS_REMOTE_LEADING_DOTS
You can also have the abs() method ignore excess ".." segments in the relative URI by setting $URI::ABS_REMOTE_LEADING_DOTS to a TRUE value.
2010-07-02T15:41:07 GwenDragonDer Apache macht das ja so:
Schleife
Wenn ./ vorhanden ist -> ./ rauslöschen aus URI
Wenn ../ vorhanden ist -> im Pfad höher gehen und ../ rauslöschen aus URI
Bis nichts mehr zu ändern ist
2010-07-02T15:23:44 GwenDragonSo machen es die Webserver bei solchen URI.
2010-07-02T15:23:44 GwenDragon./ muss es ignorieren weile es ja das aktuell angewählte Verzeichnis ist.
2010-07-02T20:17:49 pqnein. der punkt bedeutet aktuelles verzeichnis.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my $new_url = '';
eval{
my $u = URI->new_abs($link_string, $last_url);
$new_url = $u->canonical;
};
if($@){
$self->log_message("clean_link Error: $@", 20);
return undef;
}
return undef unless(length($new_url));
$new_url =~ s!\.\./!!g;
$new_url =~ s!\./!!g;
$new_url =~ s!//$!/!g;
1
2
3
<li><a href="../../../..test/x.html">X aufrufen</a>
<li><a href="../.././test/x.html">testX aufrufen</a>
<li><a href=".././t/x.html">tX aufrufen</a>