Script funzt mit Netscape, aber nicht mit dem IE. Wer weis Rat?
Stefan
- cgi
Hallo zusammen!
Folgendes Script:
---
#!/usr/bin/perl
if (!($ENV{'QUERY_STRING'})) {&login;}
else {&goUrl;}
sub login {
print "Content-type: text/html\n\n";
print qq~
<form action="login.cgi" method="get">
Login: <input type="text" name="username"><br>
Password: <input type="password" name="passwort"><br>
<input type="submit" value="submit">
~;
}
sub goUrl {
@info = split(/&/,$ENV{'QUERY_STRING'});
foreach $key (@info) {
($name,$value) = split(/=/,$key);
$moreinfo{"$name"} = $value;
}
print "Location:http://$moreinfo{'username'}:$moreinfo{'passwort'}@www.meinedomain.de/$moreinfo{'username'}\n\n";
}
exit;
---
dient dazu, mich über ein Formular in einen mit .htaccess geschützten Bereich einzuloggen.
Das ganze geht mit Netscape wunderbar. Der IE will aber nicht, wie ich will. Wenn ich den "Submit-Button" klicke geht das normale ".htaccess-Fenster" auf. Jetzt trage ich Benutzername und Passwort ein, klicke "OK", dann geht es gleich in das Verzeichnis des jeweiligen Users. Das heist für mich, daß die Variablen (zumindest username) korrekt definiert sind und auch wieder sauber ausgelesen werden. Versuche ich den Login aber "normal", indem ich nämlich das ganze in die Adresszeile des IE eintrage (http://username:passwort@meinedomain.de/username) dann gehts problemlos. Mein JS-Script mit der selben simplen Funktion funktioniert sowohl mit Netscape als auch mit dem IE.
Wer weis warum?
Viel wichtiger - wer weis wie ich das Script auch mit dem IE zum Laufen kriege?
Schon mal Danke im Voraus.
Grüße
Stefan
Ich kenn mich jetzt zwar mit Perl nicht so aus, aber ich hatte mal ein Problem mit IE mit dem logon im Intranet. Wenn die entsprechende Seite sich im Intranet, also auch auf deinem lokalen Testserver (wenn du sowas benutzt) oder auf localhost befindet, dann setzt IE bei der Anmeldung automisch den Usernamen und das Passwort vom Windows-Logon ein. Lässt sich in den Sicherheitseinstellungen von IE abstellen
Hallo zusammen!
Folgendes Script:
#!/usr/bin/perl
if (!($ENV{'QUERY_STRING'})) {&login;}
else {&goUrl;}
sub login {
print "Content-type: text/html\n\n";
print qq~
<form action="login.cgi" method="get">
Login: <input type="text" name="username"><br>
Password: <input type="password" name="passwort"><br>
<input type="submit" value="submit">
~;
}
sub goUrl {
@info = split(/&/,$ENV{'QUERY_STRING'});
foreach $key (@info) {
($name,$value) = split(/=/,$key);
$moreinfo{"$name"} = $value;
}
print "Location:http://$moreinfo{'username'}:$moreinfo{'passwort'}@www.meinedomain.de/$moreinfo{'username'}\n\n";
}
exit;
dient dazu, mich über ein Formular in einen mit .htaccess geschützten Bereich einzuloggen.
Das ganze geht mit Netscape wunderbar. Der IE will aber nicht, wie ich will. Wenn ich den "Submit-Button" klicke geht das normale ".htaccess-Fenster" auf. Jetzt trage ich Benutzername und Passwort ein, klicke "OK", dann geht es gleich in das Verzeichnis des jeweiligen Users. Das heist für mich, daß die Variablen (zumindest username) korrekt definiert sind und auch wieder sauber ausgelesen werden. Versuche ich den Login aber "normal", indem ich nämlich das ganze in die Adresszeile des IE eintrage (http://username:passwort@meinedomain.de/username) dann gehts problemlos. Mein JS-Script mit der selben simplen Funktion funktioniert sowohl mit Netscape als auch mit dem IE.
Wer weis warum?
Viel wichtiger - wer weis wie ich das Script auch mit dem IE zum Laufen kriege?
Schon mal Danke im Voraus.
Grüße
Stefan
Hi,
#!/usr/bin/perl
#!/usr/bin/perl -w
use strict;
if (!($ENV{'QUERY_STRING'})) {&login;}
[...]
perldoc CGI
print "Location:http://$moreinfo{'username'}:$moreinfo{'passwort'}@www.meinedomain.de/$moreinfo{'username'}\n\n";
Das ist
_ _ _
__ _____ _ __| |__ ___ | |_ ___ _ __ | |
\ \ / / _ \ '__| '_ \ / _ | __/ _ \ '_ | |
\ V / __/ | | |_) | (_) | || __/ | | |_|
\/ \__|_| |_.__/ \__/ \_\___|_| |_(_)
Siehe RFC 1738, http://www.ietf.org/rfc/rfc1738.txt:
"No user name or password is allowed."
Das ganze geht mit Netscape wunderbar.
Ausnamsweise ist es mal Netscape, der die Protokolle vergewaltigt und so für schadenerzeugende Dinge wie Dein Script sorgt. Netscape setzt obige... nun, eine URL ist es nicht... in etwas gültiges um und fügt RFC 2617 konforme Header hinzu. Bei allen anderen Browsern wird das defekte Ding da ungeschützt durch's Netz gejagt! Wer weiß, wie viele Systeme dadurch schon abgestürzt sind.
Der IE legt übrigens das gleiche krasse Fehlverhalten an den Tag, wenn Du so ein Ding als Link in ein HTML-Dokument packst. Ob andere Browser jenes Konglumerat akzeptieren und ins Netz pusten, den Link nicht anzeigen oder sogar den kompletten Seitenaufbau ablehnen, will ich gar nicht wissen. Ehrlich gesagt schaudert mir insbesondere bei der erstgenannten Variante.
Wer weis warum?
Wer Standards mit Füßen tritt, darf sich über "ungewöhnliches" Verhalten nicht wundern. Du wußtest wahrscheinlich nicht, daß Benutzername und Passwort in HTTP-URLs explizit untersagt sind - aber jetzt ist es Dir bekannt.
Viel wichtiger - wer weis wie ich das Script auch mit dem IE zum Laufen kriege?
Die HTTP-Authentifizierung zwischen Browser und Server kannst Du nicht auf nur einer Seite vornehmen. Der Browser muß wissen, wie er sich bei Folgeseiten authentifizieren muß - und die üblichen Mechanismen erfordern dazu die explizite Benutzereingabe. Das ist aber nicht lästig, sondern sinnvoll.
Cheatah
Hi,
#!/usr/bin/perl
#!/usr/bin/perl -w
use strict;
Ist klar. Geb ich zu. So ist's besser, aber ohne gehts auch.
print "Location:http://$moreinfo{'username'}:$moreinfo{'passwort'}@www.meinedomain.de/$moreinfo{'username'}\n\n";
Das ist
_ _ _
__ _____ _ __| |__ ___ | |_ ___ _ __ | |
\ \ / / _ \ '__| '_ \ / _ | __/ _ \ '_ | |
\ V / __/ | | |_) | (_) | || __/ | | |_|
\/ \__|_| |_.__/ \__/ \_\___|_| |_(_)
Siehe RFC 1738, http://www.ietf.org/rfc/rfc1738.txt:
"No user name or password is allowed."
...ist nicht rfc-konform - aber nicht verboten. RFC ist ja schließlich kein Gesetz sondern "nur" ein Standard. Aber auch hier gebe ich Dir Recht. Diese Lösung ist wahrlich nicht optimal (ich weis nur leider keine andere).
Der IE legt übrigens das gleiche krasse Fehlverhalten an den Tag, wenn Du so ein Ding als Link in ein HTML-Dokument packst. Ob andere Browser jenes Konglumerat akzeptieren und ins Netz pusten, den Link nicht anzeigen oder sogar den kompletten Seitenaufbau ablehnen, will ich gar nicht wissen. Ehrlich gesagt schaudert mir insbesondere bei der erstgenannten Variante.
...aber wenn ich es in die Adresszeile eintrage oder mit meinem JS-Script probiere gehts auch mit dem IE. Daher dachte ich, daß es mit meiner CGI-Lösung eigentlich auch gehen sollte.
Wer Standards mit Füßen tritt, darf sich über "ungewöhnliches" Verhalten nicht wundern. Du wußtest wahrscheinlich nicht, daß Benutzername und Passwort in HTTP-URLs explizit untersagt sind - aber jetzt ist es Dir bekannt.
War mir auch schon vorher bekannt. Ich will den Schutz aber mittels .htaccess machen.
Jetzt habe ich das Problem, daß es für meine Seite mehre Benutzer gibt. Jeder Benutzer hat sein eigenes Verzeichnis und in eben dieses muß er nach der Anmeldung (automatisch) gelangen. Eine andere Möglichkeit als die von mir verwendete weis ich leider nicht, um mich (mittels CGI) gegenüber dem Server (der .htaccess) zu identifizieren. Weist Du eine? Wie gesagt, ich möchte den Schutz selbst mit .htaccess machen und nicht mittels CGI-Script.
Ein Login über ein formlar währe zwar das höchste der Gefühle, ankommen tut es mir aber eigentlich nur auf die Weiterleitung ins Benutzerverzeichnis.
Die HTTP-Authentifizierung zwischen Browser und Server kannst Du nicht auf nur einer Seite vornehmen. Der Browser muß wissen, wie er sich bei Folgeseiten authentifizieren muß - und die üblichen Mechanismen erfordern dazu die explizite Benutzereingabe. Das ist aber nicht lästig, sondern sinnvoll.
Der Browser bzw. der Server "merken" sich ja Deine Daten (bis zum Schließen des Browsers; kannst man ja auch ansehen => REMOTE_USER) und übergibt Sie dann bei Bedarf wieder an die Folgeseiten. Das funzt ja alles wenn ich das eben nur in die Adresszeile eintrage.
Was natürlich auch noch eine Möglichkeit währe, das ist ein benutzerabhängiges redirect mittels mod_rewrite. Mit dem Ding kenne ich mich aber leider nicht aus. Du vielleicht? Weist Du dafür vielleicht eine gute Hilfeseite?
Auf jeden Fall schon mal Danke für die letzte Antwort.
Gruß
Stefan
Hi,
#!/usr/bin/perl -w
use strict;
Ist klar. Geb ich zu. So ist's besser, aber ohne gehts auch.
ja. Du merkst nur die Fehler nicht so schnell.
Siehe RFC 1738, http://www.ietf.org/rfc/rfc1738.txt:
"No user name or password is allowed."
...ist nicht rfc-konform - aber nicht verboten. RFC ist ja schließlich kein Gesetz sondern "nur" ein Standard.
Ein _technischer_ Standard, der verbindlich zur Entwicklung von Geräten (Hard- wie Software) verwendet wird.
Diese Lösung ist wahrlich nicht optimal (ich weis nur leider keine andere).
Laß die Authentifizierung vom Client ausgehen, nicht vom Server. Dieser muß nur mitteilen, daß der Client sich authentifizieren _soll_, darf es ihm aber auf keinen Fall abnehmen.
Der IE legt übrigens das gleiche krasse Fehlverhalten an den Tag, wenn [...]
...aber wenn ich es in die Adresszeile eintrage oder mit meinem JS-Script probiere gehts auch mit dem IE.
Genau das habe ich gesagt, ja :-)
Daher dachte ich, daß es mit meiner CGI-Lösung eigentlich auch gehen sollte.
Zum Glück nicht - denn das ist ein hervorragender Grund, keinen groben Unfug an Clients zu jagen, die damit noch weniger anfangen können, und währenddessen möglicherweise irgendwelche Systeme zu zerhackstückeln, von deren Existenz Du noch nicht mal was geahnt hast.
Wer Standards mit Füßen tritt, darf sich über "ungewöhnliches" Verhalten nicht wundern. Du wußtest wahrscheinlich nicht, daß Benutzername und Passwort in HTTP-URLs explizit untersagt sind - aber jetzt ist es Dir bekannt.
Jetzt habe ich das Problem, daß es für meine Seite mehre Benutzer gibt. Jeder Benutzer hat sein eigenes Verzeichnis und in eben dieses muß er nach der Anmeldung (automatisch) gelangen.
Das kannst Du mittels Server-Konfiguration machen. Stichwort mod_rewrite; vergleiche Doku unter http://www.apache.org/. Im Zweifel kannst Du auch ein PHP-Script verwenden, sofern dieses als Apache-Modul eingebunden ist - mit der CGI-Version klappt es m.W. nicht.
Ein Login über ein formlar währe zwar das höchste der Gefühle,
Das müßte mittels PHP lösbar sein.
Die HTTP-Authentifizierung zwischen Browser und Server kannst Du nicht auf nur einer Seite vornehmen. Der Browser muß wissen, wie er sich bei Folgeseiten authentifizieren muß - und die üblichen Mechanismen erfordern dazu die explizite Benutzereingabe. Das ist aber nicht lästig, sondern sinnvoll.
Der Browser bzw. der Server "merken" sich ja Deine Daten (bis zum Schließen des Browsers; kannst man ja auch ansehen => REMOTE_USER) und übergibt Sie dann bei Bedarf wieder an die Folgeseiten. Das funzt ja alles wenn ich das eben nur in die Adresszeile eintrage.
Korrekt; bis auf daß die Eingabe einer ungültigen URL nur bei sehr wenigen Browsern zu sinnvollen Ergebnissen führt. Wie erwähnt wird dort aus "http://bla:blub@domain.de/pfad" ein gültiges "http://domain.de/pfad" mit den entsprechenden Headern, die auch bei manueller Eingabe von "bla" und "blub" gesendet werden. Aber noch mal:
*Dies geschieht nur bei sehr wenigen Browsern!*
Überall sonst, wo eine ungültige URL durch's Netz geschickt wird - etwa von Deinem Script aus mittels Location-Header - sind die Konsequenzen für involvierte Systeme nicht abzusehen!
Was natürlich auch noch eine Möglichkeit währe, das ist ein benutzerabhängiges redirect mittels mod_rewrite.
Ah :-)
Mit dem Ding kenne ich mich aber leider nicht aus. Du vielleicht?
Meine Erfahrung ist da auch eher gering - aber die Doku hat mir bisher immer geholfen; auch wenn es bisweilen etwas gedauert hat. Ich empfehle einen lokalen Testserver.
Auf jeden Fall schon mal Danke für die letzte Antwort.
Gern geschehen!
Cheatah