Simon: Problem mit uri_unescape

Hallo,

bisher habe ich einem Skript den $ENV{'QUERY_STRING'} genommen und diesen mit uri_unescape "lesbar" gemacht.

Das funktionierte früher wie erwartet. Jetzt, 3 Monate später wird das Skript wieder benötigt, und ich erhalte den "lesbaren" String aber erst, wenn ich das uri_unescape zweifach ausführe.

use URI::Escape;
$ENV{'QUERY_STRING'} = "DATA=%253cALT+TYPE%253d%2522Auto%2522+SIG%253d%2522(vvv)%2522+SBSY%253d%2522(233)%2522+NOID%253d%252250%2522+SUM%253d%2522p322b%2522+MID%253d%252234-155%2522+PAS%253d%252299%2522+NAME%253d%2522REW+Q%252bT+MOSS%2522+METHOD%253d%25222%2522+IDO%253d%2522904%2522+KRI%253d%2522100%2522+WARW%253d%2522EER%2522+IP%253d%2522128.0.0.1%2522+IPC%253d%2522DE%2522+CCCO%253d%2522AF%2522+%252f%253e";

my $klartext = $ENV{'QUERY_STRING'};
print "Ausgabe des Strings ohne uri_unescape: " . $klartext . "\n"; # 

$klartext = uri_unescape($klartext);
print "Ausgabe des Strings mit einem uri_unescape: " . $klartext . "\n";

$klartext = uri_unescape(uri_unescape($klartext));
print "Ausgabe des Strings mit zweifachen uri_unescape: " . $klartext . "\n";

# Ich habe noch mal ein dreifaches uri_unescape mit reingenommen, aber dieses ändert am Ergebnis nichts mehr.
$klartext = uri_unescape(uri_unescape(uri_unescape($klartext)));
print "Ausgabe des Strings mit dreifachen uri_unescape: " . $klartext . "\n";

Ich verstehe nicht, wie das sein kann. Und auch nicht, warum ein einfaches uri_unescape nicht sofort alles dekodiert. Was habe ich da übersehen?

Danke Simon

  1. hallo

    Ich verstehe nicht, wie das sein kann. Und auch nicht, warum ein einfaches uri_unescape nicht sofort alles dekodiert. Was habe ich da übersehen?

    Du verwendest mehrfaches Encoding, offensichtlich.

    Das kann geschehen, indem du in den falschen Kontext bereits URI-kodierte Data einfügst (zum Beispiel in Formulare)

  2. Beat hat Recht: Wenn einmal decodieren nicht den Klartext rausgibt, ist das Encoding im QUERY_STRING falsch.

    Und normalerweis wird uri_unescape nicht auf den ganzen Querystring angewandt sondern nur auf den Parameter:

    my($k,$par) = split /=/, $ENV{QUERY_STRING};
    
    $par =~ s/\+/ /g;
    $par =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
    #$par =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
    
    print $par;
    

    MfG