webForumDet fria alternativet

Komplex parameter till CGI-script dubbelkodas?

21 svar · 599 visningar · startad av sne1

sne1Medlem sedan jan. 200363 inlägg
#1

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!)

HansenMedlem sedan aug. 2000374 inlägg
#2

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

sne1Medlem sedan jan. 200363 inlägg
#3

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

HansenMedlem sedan aug. 2000374 inlägg
#4

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?

sne1Medlem sedan jan. 200363 inlägg
#5

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>!

JojoxxMedlem sedan juni 20004 308 inlägg
#6

&-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");

sne1Medlem sedan jan. 200363 inlägg
#7

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?

JojoxxMedlem sedan juni 20004 308 inlägg
#8

"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.

sne1Medlem sedan jan. 200363 inlägg
#9

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�TEBORG;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?
:-)

HansenMedlem sedan aug. 2000374 inlägg
#10

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/');
}
sne1Medlem sedan jan. 200363 inlägg
#11

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...!?

HansenMedlem sedan aug. 2000374 inlägg
#12

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/');
}
sne1Medlem sedan jan. 200363 inlägg
#13

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...!
:-)

HansenMedlem sedan aug. 2000374 inlägg
#14

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?

HansenMedlem sedan aug. 2000374 inlägg
JojoxxMedlem sedan juni 20004 308 inlägg
#16

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.

sne1Medlem sedan jan. 200363 inlägg
#17

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);

sne1Medlem sedan jan. 200363 inlägg
#18

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

TACK båda två!

sne1Medlem sedan jan. 200363 inlägg
#19

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's+Sol+%26+Sk�nhet;Marklandsg.+;7;;41477;G�TEBORG;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...!

HansenMedlem sedan aug. 2000374 inlägg
#20

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*

139 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)