Das mit der momentanen loesung die ich hatte geht auf dauer nicht gut ich hab es so gemacht: Der User gibt seine daten ein und kommt auf eine neue seite dort wird das cookie nach einer pruefung verschickt und wird auf die naechste Seite geleitet. Aber das programm spinnt manchmal ;=).
Seien wir uns klar. Du arbeitest mit Perl. Er kommt nie auf eine neue Seite. Sondern du gibst immer mit dem gleichen Script den zum Kontext und zur Berechtigung passenden Output.
Mit einer sub oder sowas geht es nicht weil ich kann ja nur ein cookie schicken zu anfang des skripts.
Nein. Du kannst es schicken, solange du die header Sektion noch nicht abgeschlossen hast durch ein "\n\n". Ein Server response besteht aus header und body. Alles nach dem \n\n ist body der Server Message.
Falls du gesehen hast, dass man über print sendet:
print "Content-type: text/html; charset utf8 \n\n";
So versteckt sich hier der letzte Eintrag eines headers.
Das CGI Modul ist zwar bequem, verschleiert aber die kanonische Form eines Server Responses vor dem Autor.
Ihr habt gesagt ich muss es in der richtigen reihenfolge machen beziehungsw. es geht nur bevor ich einen htmlcode sende aber das geht doch nicht?? Der User sollte ja als erstes seine angaben machen und dann wird oder soll erst das cookie verschickt werden aber logischerweise MUSS ich ja ZUERST ein Text ausgeben.
Warum?
Request 1
Homepage ohne spezifikation
Response 1
Du prüfst,
es liegt kein Cookie vor,
Rechte: die Homepage ist öffentlich, du sendest die Homepage.
beende das Script
Request 2
Loginformular form mit name=login mit username und PW
Response 2
Du prüfst
Es ist kein Cookie vorhanden
Der task login wird erkannt
Du fühst du Sub login() aus.
DB abfragen ob
Username existeirt
Das md5 gehashte passwort auf das gespeicherte Passwort passt
wenn ok:
erstelle eine neue sessionid
registriere den user als angmeldet im Logfile
schicke den Output (eine Navigationsseite mit Willkommen etc.)
wenn nicht OK
Sende Output (wieder gleiche Seite mit Loginform und Sorry Nachricht)
beende das Script
Request 3
Link zu den privaten Daten
Response 3
Du prüfst
Es ist ein Cookie vorhanden
Du erkennst den Tast privatedatenanzeigen
Du fühst du Sub verify_user() aus.
Log-DB abfragen ob
session-id vorhanden
session-id ist noch nicht gestorben
wenn ok:
gehe in privatedatenanzeigen()
schicke den Output
wenn nicht OK
Sende Output (wieder Start-Seite mit Loginform und Sorry Nachricht)
beende das Script
Wie du siehst:
Bei jedem Response geht zunächst immer das gleiche voran:
-- Prüfe ob ein Cookie vorhanden
-- verifiziere das Cookie
-- erkenne ob ein Task login besteht, und ein Cookie erzeugt werden soll
-- allenfalls lösche veraltete Cookies
-- verifizieere weiteren Input
-- gib je nach task die angemessenen Daten heraus.
Ich sehe nich WO du da irgend ein HTML Schicken musst, bevor du auf dem Server alle diese Verifizierungstätigkeit ausführst.
In das Cookie sollen ja vorallem die daten kommen die der user bei dem einloggformular eingibt.
NEIN!
In das Cookie kommt eine Session-ID, die genau anstelle dieser Daten fortan zur Identifizierung verwendet wird.
Eine Sessinon-ID erzeugst du aus:
Eine zufällige Zahl
verbinden mit dem Zeitstring
verbinden mit Username
verbinden mit Passwort
und das ganze nun konvertieren in einen md5 (oder sha1) Hash.
Der Sinn und Zweck von Session-ID ist, dass sie nur während einer Session gültig sind. Das Passwort ist viel wertvoller als die Session-ID. Deshhalb soll es genau einmal über das Netz wandern: beim Login.
Jedoch muss auch bei einer Session-ID darauf geachtet werden:
- Sie muss einmalig sein
- Sie muss unvorhersagbar sein (deshalb die Zufallszahl)
- Sie muss bei verschiedenen Logins des Users verschiedenen Wert annehmen
Koennt ihr mir vielleicht noch sagen wie ich das am besten mache? Ich kann mir leider nicht nur im geringsten vorstellen wie ich das machen sollte bin noch nicht so gut in perl wie ihr bestimmt schon mitbekommen habt ;=)
mfg Beat