Use of uninitialized value in numeric gt (>) at...
Alain
- perl
Hallo,
ich habe eine frage bezüglich einer abfrage im $ENV{'CONTENT_LENGTH'}
was ist daran denn falsch
if ($ENV{'CONTENT_LENGTH'} > 100)
der server meldet
Use of uninitialized value in numeric gt (>) at...
welches zeichen wäre dann angebracht um die länge des strings zu messen bzw. zu zählen wie lange
der string ist?
Gruss
vom Alain
Halihallo Alain
ich habe eine frage bezüglich einer abfrage im $ENV{'CONTENT_LENGTH'}
... welches ausschliesslich bei POST gesetzt sein muss, nicht bei
GET!
was ist daran denn falsch
if ($ENV{'CONTENT_LENGTH'} > 100)
$ENV{'CONTENT_LENGTH'} ||= 0; # entweder gesetzt, oder nimmt Wert 0 an.
if ($ENV{'CONTENT_LENGTH'} > 100) {...}
Use of uninitialized value in numeric gt (>) at...
Tja, $ENV{CONTENT_LENGTH} ist nicht definiert. GET-Formularmethode
gewählt?
welches zeichen wäre dann angebracht um die länge des strings zu messen bzw. zu zählen wie lange
der string ist?
Irrelevant, dich interessiert ja nicht die Länge von
$ENV{CONTENT_LENGTH}, sondern dessen Wert, welcher die Länge des
Inputstreams bei POST definiert.
Verwende:
perldoc CGI
Viele Grüsse
Philipp
hallo,
$ENV{'CONTENT_LENGTH'} ||= 0; # entweder gesetzt, oder nimmt Wert 0 an.
if ($ENV{'CONTENT_LENGTH'} > 100) {...}Use of uninitialized value in numeric gt (>) at...
Tja, $ENV{CONTENT_LENGTH} ist nicht definiert. GET-Formularmethode
gewählt?
nö das formular sollte auf jedenfall mit POST gesendet werden.
welches zeichen wäre dann angebracht um die länge des strings zu messen bzw. zu zählen wie lange
der string ist?Irrelevant, dich interessiert ja nicht die Länge von
$ENV{CONTENT_LENGTH}, sondern dessen Wert, welcher die Länge des
Inputstreams bei POST definiert.Verwende:
perldoc CGI
das habe ich und sogar mit use strict;
Ich habs jetzt so geschrieben:
my $len = $ENV{'CONTENT_LENGTH'} || '101';
if (($len > 100) or ($ENV{'REQUEST_METHOD'} eq "GET"))
{
die("401 error 3\n");
}
Gruss vom Alain
Halihallo Alain
Verwende:
perldoc CGIdas habe ich und sogar mit use strict;
Und was greifst du noch auf $ENV{} zurück? - CGI soll genau dies
unterbinden.
Ich habs jetzt so geschrieben:
my $len = $ENV{'CONTENT_LENGTH'} || '101';
if (($len > 100) or ($ENV{'REQUEST_METHOD'} eq "GET"))
{
die("401 error 3\n");
}
Sinnvoller wäre:
if (
$ENV{'REQUEST_METHOD'} eq 'GET' ||
!exists($ENV{CONTENT_LENGTH}) ||
$ENV{CONTENT_LENGTH}>100
) {
die("401 error 3\n");
}
Entwder ist FormMethod eq 'GET' => Fehler, oder
CONTENT_LENGTH nicht definiert => Fehler, oder
wenn definiert, wenn > 100 => Fehler! sonst
OK, weiter im Text... Sehr restriktiv deine Abfrage, kein Input
grösser als 100 Zeichen erlaubt?
Viele Grüsse
Philipp
hallo Philipp,
Und was greifst du noch auf $ENV{} zurück? - CGI soll genau dies
unterbinden.
auf den $ENV{'HTTP_REFERER'}
Sinnvoller wäre:
nichts! - Kein $len, kein gar nix
if (
$ENV{'REQUEST_METHOD'} eq 'GET' ||
!exists($ENV{CONTENT_LENGTH}) ||
!$ENV{CONTENT_LENGTH} geht doch auch ?!
$ENV{CONTENT_LENGTH}>100
) {
die("401 error 3\n");
}
OK, weiter im Text... Sehr restriktiv deine Abfrage, kein Input
grösser als 100 Zeichen erlaubt?
nö kleiner als 100 zeichen erlaubt.Es handelt sich um ein login script mit
begrentzten zeichen für username und passwort.
Grüsse vom
Alain
Und was greifst du noch auf $ENV{} zurück? - CGI soll genau dies
unterbinden.auf den $ENV{'HTTP_REFERER'}
http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm#FETCHING_ENVIRONMENT_VARIABLES
!$ENV{CONTENT_LENGTH} geht doch auch ?!
Das prüft, bzw. ist wahr, wenn der Wert:
* undefiniert
* 0
* ein Leerstring
ist.
Ein Vergleich mit einem undefinierten Wert führt aber zu der von dir erhaltenen Fehlermeldung.
nö kleiner als 100 zeichen erlaubt.Es handelt sich um ein login script mit
begrentzten zeichen für username und passwort.
warum prüfst du dann nicht die Länge dieser beiden Variabeln?
Struppi.
Halihallo Struppi
!$ENV{CONTENT_LENGTH} geht doch auch ?!
Ein Vergleich mit einem undefinierten Wert führt aber zu der von dir erhaltenen Fehlermeldung.
Ach ja, da wäre dann ja noch
if (!defined($ENV{CONTENT_LENGTH})) {...}
das entspricht dann eher meinem exists() Vorschlag (nicht ganz, s.
perldoc -f exists). Danke für die Korrektur, habe ich schlicht
überlesen :-)
Viele Grüsse
Philipp
hi,
!$ENV{CONTENT_LENGTH} geht doch auch ?!
Das prüft, bzw. ist wahr, wenn der Wert:
* undefiniert
* 0
* ein Leerstringist.
Ein Vergleich mit einem undefinierten Wert führt aber zu der von dir erhaltenen Fehlermeldung.
aha ok.
warum prüfst du dann nicht die Länge dieser beiden Variabeln?
weil ich den ganzen string ... messen will und nicht nur user+pass
und zu Philipp ...danke für die infos.
Grüsse vom
Alain
warum prüfst du dann nicht die Länge dieser beiden Variabeln?
weil ich den ganzen string ... messen will und nicht nur user+pass
und zu Philipp ...danke für die infos.
Wie immer ist deine Argumentation den umständlicheren Weg zu wählen frappierend überzeugend.
Letztlich werden die daten ja so oder so übertragen und da, ich geh mal davon aus das du die evtl. anderen Werte nicht nutzt oder sonstwie abfragst, die anderen Werte auch nie auftauchen ist doch eigentlich dein interesse zu erfahren was der User in name + pass eingeben und wo er ein Fehler gemacht größer.
zumal, (da bin ich aber nicht sicher) was ist wenn Sonderzeichen eingebenen wurden und diese URL codiert wurden?
dann könnte (vermute ich jetzt) die Länge des übertragenen Strings größer sein, aber die Anzahl der eingebenen Zeichen ist eigentlich gültig.
Struppi.
hi,
warum prüfst du dann nicht die Länge dieser beiden Variabeln?
weil ich den ganzen string ... messen will und nicht nur user+pass
Wie immer ist deine Argumentation den umständlicheren Weg zu wählen frappierend überzeugend.Letztlich werden die daten ja so oder so übertragen und da, ich geh mal davon aus das du die evtl. anderen Werte nicht nutzt oder sonstwie abfragst, die anderen Werte auch nie auftauchen ist doch eigentlich dein interesse zu erfahren was der User in name + pass eingeben und wo er ein Fehler gemacht größer.
weil ich es so will,dass der benutzer nur mein formular benutzt und nicht irgend ein selbstgebasteltes formular.
In meinem formular ist es nur möglich einen string von max. 100 zeichen zu schreiben,mit allen anderen inputs welches vom formular noch mitgeschickt wird.
zumal, (da bin ich aber nicht sicher) was ist wenn Sonderzeichen eingebenen wurden und diese URL codiert wurden?
dann könnte (vermute ich jetzt) die Länge des übertragenen Strings größer sein, aber die Anzahl der eingebenen Zeichen ist eigentlich gültig.
das glaub ich nicht.
Grüsse vom Alain
weil ich es so will,dass der benutzer nur mein formular benutzt und nicht irgend ein selbstgebasteltes formular.
In meinem formular ist es nur möglich einen string von max. 100 zeichen zu schreiben,mit allen anderen inputs welches vom formular noch mitgeschickt wird.
Naja, das ist ja auch ok, aber du kannst nicht damit verhindern dass es jemand versucht.
zumal, (da bin ich aber nicht sicher) was ist wenn Sonderzeichen eingebenen wurden und diese URL codiert wurden?
dann könnte (vermute ich jetzt) die Länge des übertragenen Strings größer sein, aber die Anzahl der eingebenen Zeichen ist eigentlich gültig.das glaub ich nicht.
Du weisst aber, das alle Sonderzeichen kodiert werden? In der Form %HH? d.h. statt einem Zeichen werden 3 übertragen und kommen so bei deinem Skript an.
Struppi.
hi,
Du weisst aber, das alle Sonderzeichen kodiert werden? In der Form %HH? d.h. statt einem Zeichen werden 3 übertragen und kommen so bei deinem Skript an.
nö das wusste ich nicht 8-/
Also es kann durchaus sein,dass da ein @ als zeichen mitgeschickt wird,da
sich auch benutzer mit ihrer email anmelden.
Heisst das nun das dafür nun 3 zeichen mehr geschickt werden?
Grüsse vom
Alain
hi,
Du weisst aber, das alle Sonderzeichen kodiert werden? In der Form %HH? d.h. statt einem Zeichen werden 3 übertragen und kommen so bei deinem Skript an.
Du hast recht es war mehr als doppelt soviel als ich das formular nur mit "@" füllte.
Danke für den hinweis.
Ich habe übrigens im formular den user+pass max. lenght auch definiert.
Grüsse
vom
Alain
zumal, (da bin ich aber nicht sicher) was ist wenn Sonderzeichen eingebenen wurden und diese URL codiert wurden?
dann könnte (vermute ich jetzt) die Länge des übertragenen Strings größer sein, aber die Anzahl der eingebenen Zeichen ist eigentlich gültig.das glaub ich nicht.
nur um das klar zu stellen, es ist aber so.
zusätzlich wird natürlich noch der Wert des Submitbuttons übertragen und bei mir zumindest sind in CONTENT_LENGTH auch noch die Namen der Felder enthalten. Du kannst natürlich die Eingabe auf A-Za-z beschränken und die Namen dazu addieren, dann ist es ok, macht aber immer noch keinen Sinn. Eher noch die Auswertung von HTTP_REFERER.
Struppi.
Halihallo Alain
if (
$ENV{'REQUEST_METHOD'} eq 'GET' ||
!exists($ENV{CONTENT_LENGTH}) ||!$ENV{CONTENT_LENGTH} geht doch auch ?!
Ja. Bei komplexen Datenstrukturen gibt es beim Abfragen eines nicht
existenten Schlüssels eine autovivication, falls der Schlüssel wiederum auf eine Hash- oder Arrayref zeigen würde. Ich dachte, dass
sich dies mit exists verhindern lässt, was ich gerade versucht habe
und nicht bestätigen konnte.
http://tlc.perlarchive.com/articles/perl/ug0002.shtml
use Data::Dumper;
$t = {};
if ($t->{t}->{z}) {}
print Dumper($t);
$t ist nun { t=>{} }, nicht {}.
ich war dem Irrtum unterlegen, dass ein if (exists $t->{t}->{z})
diese autovivication unterbindet, das war aber ein Irrtum.
In deinem einfachen Beispiel hätte es jedoch sowieso keinen Einfluss
gehabt. Ich wollte nur der formhalber die 100% korrekte
Vorgehensweise verwenden. Und trotz Irrtum ist exists die korrekte
Vorgehensweise, denn du willst ja wissen, ob der Schlüssel existiert
und nicht der Wert, der darin steht (wenn ein Wert existiert, ist
dieser aufgrund des CGI-Standards immer definiert und sei es
nur '0'). Folglich halte ich 'exists' für korrekter, obgleich nicht
besser :-)
Fazit: In deinem Beispiel ist if (!ENV{...}) gleichermassen
vertretbar, wie if (!exists $ENV{...}). Bei komplexen Datenstrukturen
muss man sich hier schon ein zwei Gedanken dazu machen, denn die
autovivication impliziert Speicherverschwendung und bei schlechter
Programmierung sogar sehr viel...
Nun ja, teilweise denke ich zu wenig, teilweise auch viel zu weit :-)
OK, weiter im Text... Sehr restriktiv deine Abfrage, kein Input
grösser als 100 Zeichen erlaubt?nö kleiner als 100 zeichen erlaubt.Es handelt sich um ein login script mit
begrentzten zeichen für username und passwort.
Hm. OK :-)
Da ich
if ((length $cgi->param('usr_name')) + (length $cgi->param('usr_pwd'))<100) {
...
}
zwar für die korrektere (und CGI angepasste) Methode halte, ist deine
Lösung für das Web-Umfeld und der restriktiven Aufgabenstellung
sicher die performantere.
Du hast einfach ein zwei Probleme:
- das Script lässt sich nicht per Shell verwenden, was sonst mit
CGI funktioniert.
- das Script kann nie über GET verwendet werden (was ja in der
Aufgabenstellung so durchaus gewollt sein scheint)
was ja aber egal ist. Insofern halte ich deine Lösung für sehr gut.
Viele Grüsse
Philipp