Schrift
[thread]10561[/thread]

Parameterübergabe in Perl / CGI verwirft #



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
amun-ra198
 2007-10-11 16:22
#100677 #100677
User since
2007-10-11
13 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe ein Problem mit dem Maskieren von Werten in CGI / Perl.

Ich hole mit einem Perl Skript Werte aus einer Datenbank und übergebe diese Werte an ein weiteres Skript, dass diese dann weiterverarbeiten soll. Enthält einer der Werte ganz bestimmte Sonderzeichen (z.B. & oder #) werden alle weiteren Zeichen und Werte dahinter verworfen. Ich vermute, dass es sich um ein Problem beim Maskieren von Sonderzeichen in CGI handelt:

Skript1:
Code (perl): (dl )
1
2
3
4
5
6
use DBI;
use CGI;
my $cgi = new CGI;
...
while ( my @dsnum = $sth->fetchrow_array )     # Zugriff auf DB Werte
{<a href=\"../cgi-bin/skript2.pl?param0=$dsnum[1]&param1=$dsnum[2]&param2=$dsnum[3]&param3=$dsnum[4]&param4=$dsnum[5]&param5=$dsnum[6]&param6=$dsnum[7]&param7=$dsnum[8]&param8=$dsnum[0]\">aendern</a>}

Skript2:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
my $name = $cgi->param('param0');
my $kategorie = $cgi->param('param1');
my $unterkategorie = $cgi->param('param2');
my $benutzer = $cgi->param('param3');
my $passwort = $cgi->param('param4');
my $ersteller = $cgi->param('param5');
my $kommentar = $cgi->param('param7');
my $id = $cgi->param('param8');

print "In $name sind \& und \# schon verworfen worden";


Vielleicht hat ja jemand eine Idee wie ich die Parameter weiter verarbeiten muss, damit alle Zeichen erhalten bleiben. Ich hatte zunächst versucht die entsprechenden Sonderzeichen durch einen \ zu maskieren, was normalerweise in Perl auch funktioniert, hat leider nicht geklappt.

Weitere Ideen sind willkommen
danke
nepos
 2007-10-11 16:33
#100678 #100678
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, eventuell könntest du die Werte in der URL mit dem Modul CPAN:URI::Escape behandeln. Bin mir da aber absolut nicht sicher, ob das hilft.
GwenDragon
 2007-10-11 16:46
#100681 #100681
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Du kannst auch alles als %-codiert verwenden. Laut RFC müssen bestimmte SOnderzeichen, wenn sie zu Daten gehören maskiert werden. Denn & ist ein Parametertrenner und # ein Anker.

Anker im Grunde nicht gehören nicht zu CGI-Parametern, weil das Sprungmarken nur für den Browser sind.

Quote
Some of the uric characters are reserved for use as delimiters or as part of certain URI components. These must be escaped if they are to be treated as ordinary data. Read RFC 2396 for further details.
http://search.cpan.org/~gaas/URI-1.35/URI/Escape.pm#DESCRIPTION
pq
 2007-10-11 17:03
#100686 #100686
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
es ist ganz einfach:
Code (perl): (dl )
1
2
3
use CGI;
my $cgi = CGI->new({ foo=> '23 & 42', bar => 42});
my $url = $cgi->query_string;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Struppi
 2007-10-12 14:50
#100752 #100752
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
oder den Link mit der a Methode erzeugen, dann wird das automatisch gemacht.


Code (perl): (dl )
1
2
CGI::a( {-href => "../cgi-bin/skript2.pl?param0=$dsnum[1]&param1=$dsnum[2]&param2=$dsnum[3]&param3=$dsnum[4]&param4=$dsnum[5]&param5=$dsnum[6]&param6=$dsnum[7]&param7=$dsnum[8]&param8=$dsnum[0]"
}, 'aendern');


Warum bindet man ein Modul ein, wenn man es nur z.T. verwendet?
renee
 2007-10-12 14:55
#100753 #100753
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
... Weil man nur einen Teil braucht?? ;)

Und weil man dann teilweise nicht mehr schnell erfassen kann, *warum* etwas gemacht wird... (Wer kommst schon auf die Idee, dass man mit der "a"-Funktion die URLs escapen kann)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2007-10-12 14:58
#100754 #100754
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Struppi+2007-10-12 12:50:23--
oder den Link mit der a Methode erzeugen, dann wird das automatisch gemacht.


Code (perl): (dl )
1
2
CGI::a( {-href => "../cgi-bin/skript2.pl?param0=$dsnum[1]&param1=$dsnum[2]&param2=$dsnum[3]&param3=$dsnum[4]&param4=$dsnum[5]&param5=$dsnum[6]&param6=$dsnum[7]&param7=$dsnum[8]&param8=$dsnum[0]"
}, 'aendern');

nicht wirklich.
Code: (dl )
1
2
3
4
5
6
$ perl -wle'
use CGI;
my $key = "foo";
my $val = "bar&baz";
print CGI::a({-href => "/script?$key=$val&something=else"});'
<a href="/script?foo=bar&amp;baz&amp;something=else" />

wie man hier sieht, wird der link "/script?foo=bar&amp;baz&amp;something=else" generiert,
was ohne html-entities so aussieht:
"/script?foo=bar&baz&something=else"
und das ist einfach mal falsch. woher soll CGI.pm auch wissen, welche & zeichen escaped
werden sollen und welche nicht?
richtig ist, die parameter einzeln mit URI::escape zu escapen oder die methode, die ich
verwendet habe.
Quote
Warum bindet man ein Modul ein, wenn man es nur z.T. verwendet?

warum nicht? die html-generierenden funktion von CGI.pm sind für viele nur unnötiger
ballast. meist verwendet man doch eh ein template-system.
zu sagen, wenn du schon CGI.pm benutzt, musst du auch die html-funktionen verwenden,
ist doch genauso unsinnig.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2007-10-12 15:00
#100755 #100755
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
renee+2007-10-12 12:55:43--
Und weil man dann teilweise nicht mehr schnell erfassen kann, *warum* etwas gemacht wird... (Wer kommst schon auf die Idee, dass man mit der "a"-Funktion die URLs escapen kann)

und auf die idee sollte man auch nicht kommen, jedenfalls nicht für angehängte parameter.
siehe mein posting.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Struppi
 2007-10-12 15:16
#100756 #100756
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Die & Zeichen müssen im Parameter immer escaped werden und die Werte url decodiert

[EDIT]damit meine ich das die funktion allein nicht ausreicht.

Und noch zu meiner Aussage warum man die Funktionen nicht verwendet, hier geht es ja darum entweder den Tag von Hand auszugeben obwohl eine Modul eingebunden ist, dass diese Funktionalität zuverlässiger erfüllt.
renee
 2007-10-12 17:16
#100764 #100764
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Struppi+2007-10-12 13:16:13--
Die & Zeichen müssen im Parameter immer escaped werden und die Werte url decodiert


Die '&' sollen ja erhalten bleiben wenn es CGI-Parameter sind. Nur "innerhalb" der Werte müssen sie codiert werden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-10-11 16:22.