Apache 2.xy ignoriert 2x if (abfragen)?
Alain
- perl
Hallo,
Ich kanns fast nicht glauben,aber es war so.
Komischerweise gings beim alten apache 1.3.xy
Was ist daran verkehrt wenn ich zweimal mit
if ((length($username) < 4) or (length($password) < 4) or (!$username))
{
if ((length($username) > 40) or (length($password) > 15) or (!$password))
{
bad();
}
}
der Apache 2.xy ignoriert die erste abfrage einfach?!
Und so gehts nun:
my $lenus = length($username)||'2';
my $lenpa = length($password)||'2';
if (($lenus > 40) or ($lenpa > 15) or ($lenus < 4) or ($lenpa < 4))
{
bad();
}
Hat mir da jemand eine erlärung dafür?
Gruss
vom Alain
if ((length($username) < 4) or (length($password) < 4) or (!$username))
{
if ((length($username) > 40) or (length($password) > 15) or (!$password))
{
bad();
}
}
Keine Ahnung was vorher ist, aber das ist doch das gleiche Problem wie in dem letzten Thread von dir. Wenn $username oder $password nicht definiert ist werden bei den Vergleichen Warnungen ausgespuckt. Deshalb !$var immer zuerst.
if(!$username || !$password ||
(length $username < 4 || length $username > 40) ||
length $password < 4 || length $password > 15)
)
{
bad();
}
or hat allerdings eine ander Wichtung (bzw. Bindung) als || kann sein das es damit zusammenhängt.
der Apache 2.xy ignoriert die erste abfrage einfach?!
Das es am Server liegt halte ich für zweifelhaft, zumindest nicht wegen den Zeilen.
Und so gehts nun:
my $lenus = length($username)||'2';
my $lenpa = length($password)||'2';
hier gibst du ja auf jeden Fall einen Wert vor. D.h. length(...) kann undefniert sein?
Struppi.
hi Struppi,
Keine Ahnung was vorher ist, aber das ist doch das gleiche Problem wie in dem letzten Thread von dir. Wenn $username oder $password nicht definiert ist werden bei den Vergleichen Warnungen ausgespuckt. Deshalb !$var immer zuerst.
hmmm,eben bei den !$var happerte es anscheinend,als ich keinen usernamen eingab,ignorierte der server den fehler,ohne passwort eingabe gings.
if(!$username || !$password ||
(length $username < 4 || length $username > 40) ||
length $password < 4 || length $password > 15)
)
{
bad();
}
na gut aber da fragst Du ja auch nur einmal alles ab.Ich hatte mir einfach der übersichthalber zweimal einen if strang geschrieben.
or hat allerdings eine ander Wichtung (bzw. Bindung) als || kann sein das es damit zusammenhängt.
aber or ist doch schlussendlich dasselbe oder nur mit einer anderen priorität?
der Apache 2.xy ignoriert die erste abfrage einfach?!
Das es am Server liegt halte ich für zweifelhaft, zumindest nicht wegen den Zeilen.
Und so gehts nun:
my $lenus = length($username)||'2';
my $lenpa = length($password)||'2';hier gibst du ja auf jeden Fall einen Wert vor. D.h. length(...) kann undefniert sein?
ja damit muss ich nicht auch noch !$lenus in den if zweig einbinden,welches einen fehler erzeugt,falls kein username oder passwort geschrieben wurde.
Grüsse
vom Alain
hmmm,eben bei den !$var happerte es anscheinend,als ich keinen usernamen eingab,ignorierte der server den fehler,ohne passwort eingabe gings.
if(!$username || !$password ||
(length $username < 4 || length $username > 40) ||
length $password < 4 || length $password > 15)
)
{
bad();
}na gut aber da fragst Du ja auch nur einmal alles ab.Ich hatte mir einfach der übersichthalber zweimal einen if strang geschrieben.
nein es ist nicht dasselbe. Du hast die Abfrage !$username an den schluss gesetzt, d.h. erst überprüft ob die Länge stimmt und dann ob überhaupt was da ist.
D.h. wenn du nichts eingibst ist $username undefiniert und folglich kann er gar nicht die Länge prüfen deshalb erst !$username
Und so gehts nun:
my $lenus = length($username)||'2';
my $lenpa = length($password)||'2';hier gibst du ja auf jeden Fall einen Wert vor. D.h. length(...) kann undefniert sein?
ja damit muss ich nicht auch noch !$lenus in den if zweig einbinden,welches einen fehler erzeugt,falls kein username oder passwort geschrieben wurde.
sinvollerweise machst du das beim Abfragen des Parameters:
my $username = CGI::param('user') || '';
Dann ist $username auf jeden Fall definiert.
Struppi.
my $username = CGI::param('user') || '';
Dann ist $username auf jeden Fall definiert.
Aber Achtung, so kann man nicht mehr 0 eingeben.
Struppi.
hi,
my $username = CGI::param('user') || '';
Dann ist $username auf jeden Fall definiert.
Aber Achtung, so kann man nicht mehr 0 eingeben.
aber geht das auch mit der variable lenght?
my $username ist bereits schon definiert.
Und ich möchte auf jedenfall kein ||'nix'; haben.
vielleicht so?
my $lenus = length($username)||'2';
my $lenpa = length($password)||'2';
my $cgi = new CGI;
if ((length $cgi->param($lenus) < 4) or (length $cgi->param($lenpa) < 4))
Grüsse vom
Alain
aber geht das auch mit der variable lenght?
my $username ist bereits schon definiert.
nein, nicht wenn du im Formular nichts eingibst.
Und ich möchte auf jedenfall kein ||'nix'; haben.
vielleicht so?
my $lenus = length($username)||'2';
my $lenpa = length($password)||'2';
Das Problem sind doch die Variabeln $username und $password und nicht deren Länge
my $cgi = new CGI;
if ((length $cgi->param($lenus) < 4) or (length $cgi->param($lenpa) < 4))
eben nicht. $lenus und $lenpa sind doch die Länge der Eingabe von user + pass
So ist es sinnvoll:
use CGI;
my $user = CGI::param('user') || '';
my $pwd = CGI::param('pass') || '';
if( length $user < 4 || length $user > XX)
Damit bekommst du keinen Fehler und keine Warnung.
Struppi.
hi,
Und ich möchte auf jedenfall kein ||'nix'; haben.
vielleicht so?
my $lenus = length($username)||'2';
my $lenpa = length($password)||'2';Das Problem sind doch die Variabeln $username und $password und nicht deren Länge
my $cgi = new CGI;
if ((length $cgi->param($lenus) < 4) or (length $cgi->param($lenpa) < 4))eben nicht. $lenus und $lenpa sind doch die Länge der Eingabe von user + pass
So ist es sinnvoll:
use CGI;
my $user = CGI::param('user') || '';
my $pwd = CGI::param('pass') || '';if( length $user < 4 || length $user > XX)
Damit bekommst du keinen Fehler und keine Warnung.
ok danke,werde ich mal ausgiebig testen,bei gelegenheit.
Grüsse vom
Alain
hi Struppi,
my $username = CGI::param('user') || '';
Dann ist $username auf jeden Fall definiert.
Aber Achtung, so kann man nicht mehr 0 eingeben.
wie meinst Du das etwa so:
my $username = CGI::param('user') || '0';
?
aber mit '1' gehts...Ich hab Deine variante (unten) getestet es geht
tadellos auch die lenght werden angegeben mit oder ohne eingaben.
Die frage stellt sich mir jetzt aber,wenn das script so sicher ist,dass man dann trotzdem
das script exploiden bzw. eine liste z.B. mit AD über das login script laufen könnte,dann wär das allerdings
sehr uncool.
Grüsse vom
Alain
my $username = CGI::param('user') || '';
Dann ist $username auf jeden Fall definiert.
Aber Achtung, so kann man nicht mehr 0 eingeben.
wie meinst Du das etwa so:
my $username = CGI::param('user') || '0';
?
Nein, wenn du in das Formular eine null eingibst (und es ist ein gültiger Wert), dann wird aus der null ein Leerstring. Falls die null ein gültiger Wert ist, musst du sowas machen:
my $username = defined CGI::param('user') ? CGI::param('user') :'' ;
das script exploiden bzw. eine liste z.B. mit AD über das login script laufen könnte,dann wär das allerdings
sehr uncool.
keine Ahnung was AD ist. Falls du irgendwelche Bots meinst, die sich einloggen und nicht dürfen, solltest du einfach den Refferer prüfen, ob die Eingabe von einem guten Formular kommt.
Struppi.
hi,
my $username = CGI::param('user') || '0';
?Nein, wenn du in das Formular eine null eingibst (und es ist ein gültiger Wert), dann wird aus der null ein Leerstring. Falls die null ein gültiger Wert ist, musst du sowas machen:
my $username = defined CGI::param('user') ? CGI::param('user') :'' ;
versteh ich das jetzt richtig,dass ''; heisst das "rein gar nichts"?
Wenn ja,Heisst das auch das "rein gar nichts" dem script einen true wert zurückgibt?
Nehmen wir an ich würde da eine '1'; reinschreiben,würde das script dies als zahl eins sehen,ich meine könnte man dann
die zahl '1' als unwahr deklarieren z.B. mit lenght?Eigentlich möchte ich das so haben.Das was nach dem :''; kommt sollte einen fehler verursachen im script.
das script exploiden bzw. eine liste z.B. mit AD über das login script laufen könnte,dann wär das allerdings
sehr uncool.keine Ahnung was AD ist. Falls du irgendwelche Bots meinst, die sich einloggen und nicht dürfen, solltest du einfach den Refferer prüfen, ob die Eingabe von einem guten Formular kommt.
AD ist ein programm,mit dem man htaccess geschütze seiten durchscannen kann mit sog. wordlisten,mit div. einträgen von verschiedenen
user1:pass1
user2:pass2 daten.Theoretisch kann man auch ein loginscript so angreifen und was der referrer betrifft,das kann AD auch vortäuschen bzw. mitsenden.
Mir wäre daher lieber wenn das script abbricht,als dass es diese art von exploiding akzeptiert,weils so fehlerlos ist.
Grüsse vom Alain
Hallo Alain
hi,
my $username = CGI::param('user') || '0';
?Nein, wenn du in das Formular eine null eingibst (und es ist ein gültiger Wert), dann wird aus der null ein Leerstring. Falls die null ein gültiger Wert ist, musst du sowas machen:
my $username = defined CGI::param('user') ? CGI::param('user') :'' ;
versteh ich das jetzt richtig,dass ''; heisst das "rein gar nichts"?
Wenn ja,Heisst das auch das "rein gar nichts" dem script einen true wert zurückgibt?
Nein.
Du hast offensichtlich immer noch nicht den Unterschied eines definierten Wertes und eines falschen Wertes verstanden.
Wenn ein Formularfeld nicht ausgefüllt wird und das Formular trotzdem abschickt wird ist:
print CGI::param('name') ? 'definiert' : 'undefniert';
undefiniert
Wird eine null eingetippt ist:
print CGI::param('name') ? 'definiert' : 'undefniert';
auch undefiniert
Wenn gar nichts eingegeben wird ist:
my $name = CGI::param('name') || '';
$name ein leerer String aber definiert, d.h. du kannst die Länge abfragen ohne Fehlermeldung.
Nehmen wir an ich würde da eine '1'; reinschreiben,würde das script dies als zahl eins sehen,ich meine könnte man dann
die zahl '1' als unwahr deklarieren z.B. mit lenght?Eigentlich möchte ich das so haben.Das was nach dem :''; kommt sollte einen fehler verursachen im script.
Das ist Quatsch.
: '' ist lediglich dazu da, das kein undefinierte Eingabe erfolgt und du die Länge überprüfen kannst.
Wenn du da eine 1 hinschreibst, würde das bedeuten, das du eine 1 als Defaultwert (bei keiner Eingabe) haben möchtest, was ich sehr bezweifle.
keine Ahnung was AD ist. Falls du irgendwelche Bots meinst, die sich einloggen und nicht dürfen, solltest du einfach den Refferer prüfen, ob die Eingabe von einem guten Formular kommt.
AD ist ein programm,mit dem man htaccess geschütze seiten durchscannen kann mit sog. wordlisten,mit div. einträgen von verschiedenen
user1:pass1
user2:pass2 daten.Theoretisch kann man auch ein loginscript so angreifen und was der referrer betrifft,das kann AD auch vortäuschen bzw. mitsenden.
Mir wäre daher lieber wenn das script abbricht,als dass es diese art von exploiding akzeptiert,weils so fehlerlos ist.
Das geht nicht. Wenn ein Skript den Referrer fälscht und dem Skript gültige Werte übermittelt kannst du das nicht verhindern.
Struppi.
Hallo Struppi,
hi,
my $username = CGI::param('user') || '0';
?Nein, wenn du in das Formular eine null eingibst (und es ist ein gültiger Wert), dann wird aus der null ein Leerstring. Falls die null ein gültiger Wert ist, musst du sowas machen:
ok das war klar.
my $username = defined CGI::param('user') ? CGI::param('user') :'' ;
»»
ja,das versteh ich auch,ich hatte eben ein problem mit dem ''; (nichts),was das bedeutet ein leerstring.
Du hast offensichtlich immer noch nicht den Unterschied eines definierten Wertes und eines falschen Wertes verstanden.
Wenn ein Formularfeld nicht ausgefüllt wird und das Formular trotzdem abschickt wird ist:
print CGI::param('name') ? 'definiert' : 'undefniert';
undefiniert
Wird eine null eingetippt ist:
print CGI::param('name') ? 'definiert' : 'undefniert';auch undefiniert
Wenn gar nichts eingegeben wird ist:
my $name = CGI::param('name') || '';
$name ein leerer String aber definiert, d.h. du kannst die Länge abfragen ohne Fehlermeldung.
aha,aber was wäre dann die länge eines leerstrings,rein theoretisch? ''(2)?
: '' ist lediglich dazu da, das kein undefinierte Eingabe erfolgt und du die Länge überprüfen kannst.
Wenn du da eine 1 hinschreibst, würde das bedeuten, das du eine 1 als Defaultwert (bei keiner Eingabe) haben möchtest, was ich sehr bezweifle.
ok,aber eigentlich möchte ich schon einen (leer)string prüfen können bzw. eine klare definition um dann einen fehler dennoch von mir zu erzeugen,dann wäre z.B.
eine abfrage wie diese denkbar:
my $name = CGI::param('name') || 'xyz';
if ($name eq "xyz")
{
die "falsche eingabe\n";
}
das hiese jetzt,wenn der benutzer nichts eingibt dann wäre $name = xyz und das sollte einen fehler erzeugen.
es wäre aber in dem fall auch dies denkbar:
if ($name eq '')
{
die "falsche eingabe\n";
}
ich hoffe das ist nun korrekt.
Das geht nicht. Wenn ein Skript den Referrer fälscht und dem Skript gültige Werte übermittelt kannst du das nicht verhindern.
aber erschweren könnte man es schon.
Grüsse
vom Alain
Hallo Struppi,
Ich habs jetzt eben ausprobiert,also im klartext bedeutet ''; dasselbe wie '0'
Na gut so wie es jetzt ist,so ists auch gut.
Danke für die geduld ;-)
Grüsse und frohes weekend
vom Alain
Ich habs jetzt eben ausprobiert,also im klartext bedeutet ''; dasselbe wie '0'
jein, ein Leerstring hat die Länge null
my $string = '';
print length $string;
ergibt 0
ist aber der String undefiniert ergibt length $string einen Fehler: Use of uninitialized value
deshalb:
$string = CGI::param('name') || '';
Struppi.
hi,
jein, ein Leerstring hat die Länge null
ok dann mein ich 0 ,denn das war die ausgabe dess lenght strings vom server,wie Du ja unten auch bestätigst.
Ich habs jetzt kapiert ;-) endlich
my $string = '';
print length $string;
ergibt 0
genau.
ist aber der String undefiniert ergibt length $string einen Fehler: Use of uninitialized value
deshalb:
$string = CGI::param('name') || '';
ich habs jetzt aber noch einfacher gelöst nähmlich so:
$string = CGI::param('name') || bad();
der username MUSS eingegeben werden,alles andere erzeugt einen fehler.
Die funktion bad sieht so aus:
sub bad {
print "Location: $errorurl\r\n\r\n";
exit;
}
Grüsse vom
Alain
ich habs jetzt aber noch einfacher gelöst nähmlich so:
$string = CGI::param('name') || bad();
Wie gesagt, das ist ok, solange nicht die Null eine gültige Eingabe ist, da eine null auch bad aufruft.
Struppi.