---
title: "Komplex parameter till CGI-script dubbelkodas?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/perl-ruby/63991-komplex-parameter-till-cgi-script-dubbelkodas"
topic: "Perl & Ruby"
topic_url: "https://www.webforum.nu/amne/perl-ruby"
author: "sne1"
published: "2003-01-06T20:16:55.000Z"
updated: "2003-01-07T19:38:11.000Z"
replies: 21
views: 641
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/perl-ruby/63991-komplex-parameter-till-cgi-script-dubbelkodas"
---

# Komplex parameter till CGI-script dubbelkodas?

_Sida 1 av 2._

## #1 — sne1, 2003-01-06T20:16Z

Den som löser detta är rejält duktig på sina saker...!

Jag har ett litet cgi-script som räknar antal click och som förväntar sig en URL, för att kunna redirecta omedelbart efter clickräkningen, enligt följande påhittade exempel.
CGI-scriptet fungerar utmärkt.
Ibland måste jag dock ersätta exempelvis "&" med %26, ";" med %3b och "+" med %2b, för att få redirect att fungera korrekt.
Men det är OK.
Tills jag har en alltför "avancerad" URL som inparameter till CGI-scriptet.
Problemet verkar vara att ett av "värdena" i http-harangen innehåller ett "&"-tecken, som SKALL vara just TECKNET "&" och INTE specificera att det är någon slags "kod" på gång, som i andra fall (i ex.vis "?what=map%26mop=xx" har %26 ersatt ett "kod-&").
Troligen är det alltså "&" i "Pelle's%2bStrul%2b%26%2bProblem" som måste fixas till, på något vis.
Jag fattar dock inte hur jag skall kunna kringgå detta...

TACKSAM för hjälp!

Som sagt; den som löser detta är rejält duktig på sina saker...!

http://min.hemsida.se/cgibin/click.pl?URL=http://www.referenssida.se/query
?what=map%26mop=xx%26mapcomp=RSID_10888161%3b584745%3bPelle's%2bStrul%2b%26
%2bProblem%3bSandgatan%2b%3b69%3b%3b12345%3bG%D6TEBORG%3b031%3b41%2b00%2b
77%3b1269142%3b6400864%3b0%3b0%26mapstate=7%3b1269142%3b6400864%3b0%3b0%3b0%
3b0%3b0%3b

(OBSERVERA att eventuella space eller radmatningar mellan tecknen i länken ovan INTE skall vara där; allt är i en enda lång rad!)

Permalänk: https://www.webforum.nu/p/63991

## #2 — Hansen, 2003-01-07T13:39Z

Posta lite kod, så blir det lättare att hjälpa dig!

Permalänk: https://www.webforum.nu/p/903977

## #3 — sne1, 2003-01-07T13:52Z

Tack Hansen!

Hoppas att du fixar det!

CGI-scriptet click.pl ser ut som följer.

\#!/usr/bin/perl

use strict;
use CGI;

my $cgi = new CGI;
my $time = localtime(time);
my $url = $cgi-\>param("URL");
my $file = "./log/log.txt";

write_log();

print $cgi-\>header();
print $cgi-\>start_html(-title =\> 'Redirecting... Please wait...');
print "\<body onload=location.href='" . "$url" . "'\>";
print $cgi-\>end_html();
exit(0);

sub write_log()
{
  open(LOG, "\>\>$file");
  print LOG "$url\*$time\*\\n";
  close(LOG);
}

Smutt litet script, va!?
:-)

/Pelle

Permalänk: https://www.webforum.nu/p/903984

## #4 — Hansen, 2003-01-07T14:13Z

> Smutt litet script, va!?

 
Bra att du använder CGI.pm! 

```
open(LOG, ">>$file") or die "can't append data to $file. reason: $!\n";
```

är bättre.

Kan ge ett exempel på en input url och output från scriptet?

Permalänk: https://www.webforum.nu/p/903995

## #5 — sne1, 2003-01-07T14:29Z

Bra förslag till open... men det fungerar så bra (bara detta som har krånglat, so far) och ingen annan felhantering finns, så...
:-)

Vad menar du med CGI.pm?
Menar du CGI.pl?

Visst!
Input:
<http://min.hemsida.se/cgibin/click.pl?URL=http://www.webforum.nu/>
kommer att skriva i log-filen som ligger på <http://min.hemsida.se/> och omedelbart redirecta till <http://www.webforum.nu/.>
Scriptet ger ingen output, mer än ett entry i log-filen, typ:
<http://www.webforum.nu/*Tue> Jan  7 15:31:02 2003

Testa själv, så ser du sedan att det  inte går om du har en URL=\<en http-sträng med ett "&" i sig\>!

Permalänk: https://www.webforum.nu/p/904006

## #6 — Jojoxx, 2003-01-07T15:24Z

&-tecken \*måste\* kodas eftersom de används vid GET får att separera parametrar;

.../script.pl?namn=kalle&skostorlek=42&favoritmat=pizza

CGI.pm är en standardmodul i perl för att hantera vissa CGI-relaterade operationer, ex. GET;

use CGI;
$url=CGI::param("url");

Permalänk: https://www.webforum.nu/p/904063

## #7 — sne1, 2003-01-07T15:51Z

Jo, att & måste kodas (när man separerar parametrar) är jag med på, MEN i just detta fall finns det ett &-tecken i själva "texten", som INTE betyder "parameter-&".

Pelle's%2bStrul%2b%26%2bProblem
skall alltså egentligen vara
Pelle's+Strul+&+Problem
där & är ett &-tecken (en del av namnet "Pelle's Strul & Problem") och ingen parameterinledning.
Mottagarsidan (inte min...) MÅSTE få EXAKT "Pelle's+Strul+&+Problem" till sig, för att fungera.
Jag har även provat med att skicka
Pelle's%2bStrul%2b&%2bProblem (& som det är)
Pelle's%2bStrul%2b%%26%2bProblem (ett extra % före %26)
Pelle's%2bStrul%2b%25%26%2bProblem (ett %25 (="%") före %26)
men det går inte heller.

HJÄLP!?
Idéer någon?

Permalänk: https://www.webforum.nu/p/904093

## #8 — Jojoxx, 2003-01-07T15:56Z

"Pelle's%2bStrul%2b%26%2bProblem" **är** exakt "Pelle's+Strul+&+Problem" skickat via http-GET tar du emot det via CGI.pm så blir det rätt... Jag förstår inte var problemet är.

Permalänk: https://www.webforum.nu/p/904097

## #9 — sne1, 2003-01-07T15:58Z

Det är Gula Sidorna som spökar.
Ta vilket företag som helst, som har ett & i namnet.
T.ex. Smaskens Pizza & Grill.
Länken till informationen om företaget på Gula Sidorna är (direkt kopierat)
<http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_12379549;192327;Smaskens+Pizza+%26+Grill;Stenungsundsg.+;2;;41674;G%D6TEBORG;031;21+52+55;1275710;6405384;0;1&mapstate=7;1275710;6405384;0;0;0;0;0;>
vilket fungerar ypperligt i IE:s adressfält.
Men för att kunna skicka denna länk till mitt script, måste jag ändra &, +, ; m.fl. tecken till %26, %2b osv...
Och just i ett sådant här fall kommer det inte att fungera, eftersom & i själva NAMNET redan HAR ersatts med %26!

Någon som förstår?

Ännu bättre; någon som förstår och har en lösning?
:-)

Permalänk: https://www.webforum.nu/p/904098

## #10 — Hansen, 2003-01-07T16:01Z

Testa detta, klarar både korrekta (encodade) och felaktiga url´er:

click.pl?url=http://www.webforum.nu/showthread.php?s=&threadid=62664
click.pl?url=http%3A%2F%2Fwww.webforum.nu%2Fshowthread.php%3Fs%3D%26threadid%3D62664

```
#!/usr/bin/perl

use strict;
use warnings;

use CGI;

my $q = new CGI;

if ( my $query = $ENV{'QUERY_STRING'} ) {
    $query =~ s/url=//i;
    $query =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
    print $q->redirect($query);
}
else {
    print $q->redirect('http://www.google.com/');
}
```

Permalänk: https://www.webforum.nu/p/904101

## #11 — sne1, 2003-01-07T16:23Z

Mjäää...
Nästan...
Testa själv med att anropa scriptet med
<http://www.webforum.nu/cgibin/clicktest.pl?URL=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria>'s+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;

jämfört med att BARA skjuta
<http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria>'s+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;
i en browser.
Viss information (adress mm) tappas, eller hur!?
Detta BORDE ju inte vara alls svårt, eller...!?

Permalänk: https://www.webforum.nu/p/904119

## #12 — Hansen, 2003-01-07T16:30Z

Nopp ;o)

```
#!/usr/bin/perl

use strict;
use warnings;

use CGI;

my $q = new CGI;

if ( my $query = $ENV{'QUERY_STRING'} ) {
    $query =~ s/url=//i;
    print $q->redirect($query);
}
else {
    print $q->redirect('http://www.google.com/');
}
```

Permalänk: https://www.webforum.nu/p/904128

## #13 — sne1, 2003-01-07T17:09Z

Du tog bara bort raden
$query =\~ s/%(\[0-9A-Fa-f\]{2})/chr(hex($1))/eg;
eller?

Får du verkligen
<http://www.webforum.nu/cgibin/clicktest?URL=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria>'s+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;
att fungera?

Jag får Internal Server Error...
:-(

:-)

Jag tror att det bästa vore om man kunde angripa problemet i "botten".
Problemet är ju att länken till Gula Sidorna innehåller ett & som inte skall avkodas som annat än & och inte inledningen till en parameter.
Finns det beskrivet någonstans (specifikation) att "& inte får användas" i dessa sammanhang?
Eller står det snarare någonstans hur man kommer runt problemet?
Ungefär som när man måste skriva dubbla \\\\ för att få ett \\ i andra sammanhang.

Den som löser detta är KUNGARNAS KUNG -  på CGI, i alla fall...!
:-)

Permalänk: https://www.webforum.nu/p/904163

## #14 — Hansen, 2003-01-07T17:35Z

> Du tog bara bort raden
> $query =\~ s/%(\[0-9A-Fa-f\]{2})/chr(hex($1))/eg; 
> eller?

Jepp, scriptet kommer inte att försöka omvandla eventuella hexadecimala tecken (%xx).

> Får du verkligen \[snip\] att fungera?

Yes, här fungerar det utmärkt. Kommer till Victoria's Sol & Skönhet.

Testa igen:

click.pl?url=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;

Vad får du för resultat?

Permalänk: https://www.webforum.nu/p/904210

## #15 — Hansen, 2003-01-07T17:48Z

Testa denna url med:

click.pl?url=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_21343475;;Kjell%20&%20Company;;;;;;;;1306276;6217303;1;1;&mapstate=7;1306276;6217303;0;0;0;0;0;

Innhåller oxå ett &.

Permalänk: https://www.webforum.nu/p/904227

## #16 — Jojoxx, 2003-01-07T17:52Z

Hom hom...

det som hamnar i miljödataarean  (fin svensk omskrivning) $ENV{'QUERY_STRING'} är exakt den query-string som webbläsaren skickar vid förfrågan. Anropar du;

dittscriplt.pl?url=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;

så hittar du;

url=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;

i $ENV{'QUERY_STRING'}.

Men, eftersom det inte är en korrekt formaterad GET-sträng så plockar hansen bort den första förekomsten av "url=" med $query =\~ s/url=//i;

Det som är kvar är alltså din URL som du skall vidarebefodra användaren till.

> Finns det beskrivet någonstans (specifikation) att "& inte får användas" i dessa sammanhang?

Javisst, [RFC2396](http://www.ietf.org/rfc/rfc2396.txt).

Permalänk: https://www.webforum.nu/p/904229

## #17 — sne1, 2003-01-07T17:59Z

JA! Det fungerar!
Jag glömde (den andra gången) att sätta .pl-filen till executable...
Mitt PUCKO!

TACK!
Återstår bara att du förklarar, om du vill, ditt lilla script!?

1\. Hur kan du fråga om $query är lika med något, innan $query HAR något värde?
Det sätts ju inte första gången förrän I if-satsen, EFTER att statementet testas, eller...!?

2\. Vad betyder $ENV{'QUERY_STRING'}?

3\. Vad innebär tilldelningen =\~ s/url=//i;?

if ( my $query = $ENV{'QUERY_STRING'} ) {
    $query =\~ s/url=//i;
    print $q-\>redirect($query);

Permalänk: https://www.webforum.nu/p/904230

## #18 — sne1, 2003-01-07T18:00Z

Jojoxx svarade under tiden jag frågade...
:-)

TACK båda två!

Permalänk: https://www.webforum.nu/p/904233

## #19 — sne1, 2003-01-07T18:06Z

Men jag fattar uppriktigt sagt inte hur det kan fungera bara genom att ta bort "url=" i min parameter (http-stringen som skall användas av scriptet för att redirecta)...?
Då borde väl även
.../cgibin/click.pl?<http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria%27s+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;>
fungera!?
Vilket det inte gör...
:-)

Fattar inte, och det är trots allt det viktigaste - att fatta vad man håller på med...!

Permalänk: https://www.webforum.nu/p/904237

## #20 — Hansen, 2003-01-07T18:10Z

Vi börajar med miljövariabler. 

Exekvera detta script i din cgi-bin.

env.pl:

```
#!/usr/bin/perl

use strict;
use warnings;
use CGI;

my $q = new CGI;

print
  $q->header,
  $q->start_html(
    -title => 'Miljövariabler',
    -style =>
        {
            -code       => 'body, td { font-family: Verdana; }'
                         . 'td { padding: 5px; font-size: 8pt; }'
	}
  ),
  $q->start_table(),
  $q->Tr( $q->td( { -colspan => 2 }, $q->h3('Miljövariabler') ) ),
  $q->Tr( [ map { $q->td( [ $_, $ENV{$_} ] ) } sort keys %ENV ] ),
  $q->end_table(),
  $q->end_html;
```

Återkommer strax, måste bara röka..

\*red: stavfel\*

Permalänk: https://www.webforum.nu/p/904243

---

Tråden på webben: https://www.webforum.nu/amne/perl-ruby/63991-komplex-parameter-till-cgi-script-dubbelkodas  
Nästa sida: https://www.webforum.nu/amne/perl-ruby/63991-komplex-parameter-till-cgi-script-dubbelkodas/page2.md
