• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

php verständnisproblem

T

tuumie

Gast
php verständnisproblem

Ich möchte wie so viele einen Passwortschutz auf einer Seite einrichten. Die Realisierung ist auch kein Problem mit php, da habe ich was gelesen über sessions, nur ist mir nicht ganz klar, wie es funktioniert, dass das Passwort nur einmal eingegeben werden muss. Die Rede war da von einem Cookie, der sich nach einem Jahr selbst löscht. Und wenn dieser Cookie existiert, werden die versteckten Optionen aktiviert, sonst nicht. Ja gut, ich möchte aber, dass der Nutzer das Passwort eingeben muss und dann arbeiten kann und sobald er die Homepage verlässt, soll die Passwortabfrage erneut statt finden, wenn sie wieder aufgerufen wird. Ich will nicht, dass der Nutzer und jeder andere am selben Rechner für ein Jahr einen Freifahrschein hat. Deshalb ist mir nicht ganz klar, was das mit dem Cookie auf sich hat (Cookies werden ja auch von manchen Nutzern ganz verboten - die kommen dann gar nicht in den Genuss oder wie?).
Danke für jede Antwort.

Ach noch was:
Ich habe den Apache Webserver zu Hause installiert, um die php Skripte testen zu können. Aber wenn ich ein Skript habe, was sich selbst (also dieselbe Datei) aufruft, dann checkt das der Browser nicht. Woran kann das liegen? Es wird einfach die Seite nochmal geladen, wobei eigentlich beim Absenden ein Variableninhalt übergeben werden sollte, der dann über den angezeigten Inhalt entscheidet. Wenn ich aber das Ding auf einen richtigen Webspace lade und dort aufrufe, funktioniert das Skript einwandfrei.
 
AW: php verständnisproblem

hi,

1) also wenn man das über cookies macht, hätte es nur den sinn dass der user immer wenn er auf die seite geht eingeloggt ist, und wenn du genau das nicht willst, dann schreib einfach das was du brauchst um den user zu identifizieren (passwort und/oder username) in die session, so bleibt er eingeloggt wenn er auf der seite surft. wenn er nächstes mal wiederkommt muss er sich neu einloggen... um das ganze noch halbwegs sicher zu mache könnte man das passwort z.b. mit md5() verschlüsseln

2) deine php dateien muss du in den htdocs-ordner in deinem apache verzeichnis packen und dann im browser den server über http://localhost ansprechen, dann gehts...

hoffe ich habe geholfen...
 
AW: php verständnisproblem

blood-devil am 03.11.2004 17:10 schrieb:
hi,

1) also wenn man das über cookies macht, hätte es nur den sinn dass der user immer wenn er auf die seite geht eingeloggt ist, und wenn du genau das nicht willst, dann schreib einfach das was du brauchst um den user zu identifizieren (passwort und/oder username) in die session, so bleibt er eingeloggt wenn er auf der seite surft. wenn er nächstes mal wiederkommt muss er sich neu einloggen... um das ganze noch halbwegs sicher zu mache könnte man das passwort z.b. mit md5() verschlüsseln

2) deine php dateien muss du in den htdocs-ordner in deinem apache verzeichnis packen und dann im browser den server über http://localhost ansprechen, dann gehts...

hoffe ich habe geholfen...

Hast Du denn auch php auch mitinstalliert, bzw. war das bei deinem Apache mit drin?
 
AW: php verständnisproblem

Danke für die Antworten.

1) Es soll so aussehen, dass die Navigation links einmal per Passwort freigeschaltet werden soll. Die Navigation oben ist für jeden zugänglich. Beide sind jeweils als iframe implementiert. Wenn also jemand auf einen Link oben klickt, wird die eingebettete Navigation neu geladen und muss wissen, dass vorher schon mal das Passwort richtig eingegeben wurde. Meine Frage ist, wie das realisiert wird in der Session, das würde ich gerne verstehen. Irgendwoher muss ja die Information kommen: aha, der Nutzer ist angemeldet, dann gebe ich doch mal die Extra-Verweise frei.

2) PHP habe ich dazu installiert. Die Dateien sind im Ordner, wo sie hingehören. Bei den PHP Dateien sehe ich auch nicht mehr den Quellcode wie zuvor, also denke ich doch, dass PHP richtig installiert ist. Kann es jedoch nicht 100%ig sagen, da muss man doch in der Config-Datei selber rumschreiben und PHP als CGI-Skript einbinden. Aaaaach! Alles so kompliziert. Als Modul einbinden ging übrigens nicht.
 
AW: php verständnisproblem

tuumie am 03.11.2004 21:58 schrieb:
Danke für die Antworten.

1) Es soll so aussehen, dass die Navigation links einmal per Passwort freigeschaltet werden soll. Die Navigation oben ist für jeden zugänglich. Beide sind jeweils als iframe implementiert. Wenn also jemand auf einen Link oben klickt, wird die eingebettete Navigation neu geladen und muss wissen, dass vorher schon mal das Passwort richtig eingegeben wurde. Meine Frage ist, wie das realisiert wird in der Session, das würde ich gerne verstehen. Irgendwoher muss ja die Information kommen: aha, der Nutzer ist angemeldet, dann gebe ich doch mal die Extra-Verweise frei.

2) PHP habe ich dazu installiert. Die Dateien sind im Ordner, wo sie hingehören. Bei den PHP Dateien sehe ich auch nicht mehr den Quellcode wie zuvor, also denke ich doch, dass PHP richtig installiert ist. Kann es jedoch nicht 100%ig sagen, da muss man doch in der Config-Datei selber rumschreiben und PHP als CGI-Skript einbinden. Aaaaach! Alles so kompliziert. Als Modul einbinden ging übrigens nicht.

also zu 1) würde ich sagen, dass die seite die im iframe ist eine php seite ist, die nur ein menu anzeigt wenn die daten aus der session "klarstellen" dass jemand eingeloggt ist. wie eine session insgesamt funktioniert findet man unter selfphp oder php.net. wenn eine variable in einer session definiert wurde, dann ist sie auch nach dem neuladen der seite noch verfügbar, so lange die session mit session_start() wieder aufgerufen wird.
der session könnte man z.b. eine variable zuteilen, die den wert 0 hat und wenn man sich einloggt wird der wert der variable in den username geändert,. wenn die variable == 0 ist, dann wird kein menu angezeigt, andernfalls wird eins angezeigt. wenn das menu einfach nur passwortgeschützt ist, also eben ohne spezifische user+passwort, dann änder die variable einfach in 1, oder so.....

2) so einen webserver mit php etc. zu installieren ist nicht das einfachste, aber es gibt schon fertigpakete die man nur entpacken und starten muss. ich benutze xampp lite, das ist wirklich einfach und funktioniert perfekt
 
AW: php verständnisproblem

Ich habe es ausprobiert mit den Sessions, aber irgendwie will das nicht so einfach funktionieren, wie man überall liest.
Ich habe eine Login Seite mit erstmal nur einem Feld für ein Passwort. Gibt man irgendwas ein, wird eine Session gestartet mit
$_SESSION[user_name] = (eingegebenes Wort)
Zur Kontrolle lasse ich mir das noch mal ausgeben und die Session ID dazu. Das funktioniert einwandfrei.
Nun rufe ich eine andere Seite auf, in der zu allererst
<?php
session_start();

steht. Angeblich wird damit die bereits bestehende Session weiter geführt. Wenn ich mir aber auf der neuen Seite nochmal die Session ID ausgeben lasse, unterscheidet die sich von der vorherigen. Der User Name ist auch futsch.
 
AW: php verständnisproblem

probier mal das aus:

<?php
session_start();
session_register(username);

die beiden befehle müssen immer ausgeführt werden damit 1.) die session weitergeführt (oder gestartet) wird und 2.) damit die variable bleibt wie sie ist

jetzt kannst du einmal die variable definieren:

$username = "eingegebener text";

und dann müsste sie immer da sein...
 
AW: php verständnisproblem

Na ja, es will nicht gehen.
Heir mein Code:

Datei 1.php
<?php
session_start();
echo session_id(); echo"<br>";
session_register(pw);
$pw = "user";
echo "Hallo $pw, möchtest du zu deiner <a href=2.php>Seite</a>";
?>

Datei 2.php
<?php
session_start();
session_register(pw);
echo session_id(); echo"<br>";
if ( $pw == "user" )
{
header ("Location: $pw.php");
}
else { echo"geht nicht"; }
?>


Auf der 2.php kommt immer "geht nicht".
 
AW: php verständnisproblem

Jetzt weiß ich woran es liegt:
Wenn ich die Firewall deaktiviere, wird der Session-Cookie akzeptiert. Wenn ich sie einschalte, nicht.
Also muss ich die Session-ID mitgeben beim Seitenaufruf, dann klappt es auch mit der Firewall.
 
AW: php verständnisproblem

tuumie am 06.11.2004 15:06 schrieb:
Jetzt weiß ich woran es liegt:
Wenn ich die Firewall deaktiviere, wird der Session-Cookie akzeptiert. Wenn ich sie einschalte, nicht.
Also muss ich die Session-ID mitgeben beim Seitenaufruf, dann klappt es auch mit der Firewall.


gut, dann gehts ja jetzt :-)
mit meiner firewall gibts damit keine probleme.
 
AW: php verständnisproblem

Vielleicht noch ein kleiner Hinweis am Rande:

Die Funktion session_register() zum Registrieren von Variablen in der Session sollte nicht verwendet werden, wenn in der php.ini die Option register_globals auf off gesetzt ist (Standardeinstellung ab PHP Version 4.2.0 und aus Sicherheitsgründen auch unbedingt beizubehalten!). Wenn du damit auf deine Session zugreifst, funktioniert dein Script nicht auf Webservern, bei denen register_globals deaktiviert ist.

Stattdessen solltest du das globale Array $_SESSION verwenden. Um eine Variable in der Session zu speichern gehst du so vor:

Anstelle von:

session_register(pw);
$pw = "user";

Schreibst du:

$_SESSION["pw"] = "user";

--------------------------------------------------------------------------------------

Das Auslesen in Datei 2 würde dann wie folgt aussehen:

Anstelle von:

session_register(pw);
if ( $pw == "user" )
{
header ("Location: $pw.php");
}
else { echo"geht nicht"; }


Schreibst du:

if (isset($_SESSION["pw"])) {
$pw = $_SESSION["pw"]; // Der Einfachheit halber
if ($pw == "user") {
usw...
}

Wie du siehst, brauchst du in der Datei 2 die Variable nicht noch einmal registrieren, weil sie bereits in Datei 1 im $_SESSION-Array gespeichert wurde.

Ist wirklich nicht schwer und ein saubererer (gibt es diese Steigerungsform überhaupt? ^^; ) Stil als session_register().

Technisch funktioniert das mit den Sessions übrigens so, daß PHP bei Aufruf von session_start() automatisch eine neue Session mit einer zufällig generierten ID erstellt bzw. eine bereits vorhandene Session, die über den Cookie mit dem jeweiligen Benutzer assoziiert ist, wieder aufnimmt. Alle Variablen, die in dieser Session registriert sind, werden dann in einem speziellen Verzeichnis auf der Festplatte des Webservers gespeichert (in Dateien, die mit der jeweiligen Session-ID verknüpft sind). Sobald die Session beendet wird, entfernt PHP diese Dateien wieder. Das kann man im Script durch den Aufruf von session_destroy() bewirken.
 
AW: php verständnisproblem

Vielen Dank, das werde ich berücksichtigen.
Ist es sicher genug, wenn man das Passwort in einer Datenbank speichert? Bis jetzt habe ich es ja noch im Quelltext stehen, was später unbedingt da raus muss.
 
AW: php verständnisproblem

tuumie am 08.11.2004 21:03 schrieb:
Vielen Dank, das werde ich berücksichtigen.
Ist es sicher genug, wenn man das Passwort in einer Datenbank speichert? Bis jetzt habe ich es ja noch im Quelltext stehen, was später unbedingt da raus muss.

Prinzipiell solltest du das Paßwort immer verschlüsselt speichern. Es gibt mehrere PHP-Funktionen, die verschiedene Verschlüsselungsalgorithmen zur Erzeugung eines Hash-Wertes bereitstellen. MD5 ist ein sehr beliebter Algorithmus, gilt aber seit neuesten Forschungsergebnissen nicht mehr als ganz so sicher. Trotzdem ist die Wahrscheinlichkeit, daß sich jemand wirklich die Mühe macht, ein solcherart verschlüsseltes Paßwort zu knacken - wenn nicht gerade sehr viel Geld oder sehr geheime Daten als Belohnung winken - sehr gering.

Alle wichtigen Hash-Funktionen von PHP finden sich in der Übersicht der String-Funktionen (einfach die Kurzbeschreibungen lesen, dann findest du sie schnell):
http://de3.php.net/manual/en/ref.strings.php

Das ganze funktioniert wie folgt:
Zunächst wird aus dem Klartextpaßwort mit Hilfe der für den gewählten Algorithmus zuständigen Funktion der Hash-Wert erzeugt. Zum Beispiel so:

<?php
$pw = "user";
$pwHash = md5($pw);
?>

Den Wert aus $pwHash - und nur den, nicht das Klartextpaßwort! - speicherst du dann in der Datenbank.
Diese Methode ist deshalb sehr sicher, weil man aus dem Hash-Wert nicht mehr das Klartextpaßwort ermitteln kann. Die Verschlüsselung erfolgt einseitig und kann nicht rückgängig gemacht werden. Sollte also jemand Zugriff auf die Benutzerkonten in der Datenbank erhalten, wird er dennoch nicht in der Lage sein, die Paßwörter in Erfahrung zu bringen.

Wenn der Benutzer sich einloggt, gibt er natürlich das Klartextpaßwort ein. Alles, was du dann noch tun mußt, ist diese Eingabe mit der gleichen Hash-Funktion zu verschlüsseln und den so entstandenen Hash-Wert mit dem zu vergleichen, der in der Datenbank steht. Da aus einer bestimmten Zeichenkette immer exakt der gleiche Hash-Wert gebildet wird, muß das eingegebene Paßwort korrekt sein, wenn die beiden Werte identisch sind.

Das könnte so aussehen:
(Nehmen wir an, in $pass ist das durch den User eingegebene Paßwort gespeichert).

<?php
if (md5($pass) == $hash_aus_datenbank) {
echo "Richtig!";
} else {
echo "Möööp! Falsch!";
}
?>

Das Session-System an sich ist nicht vor Mißbrauch geschützt. Sollte es einem anderen Benutzer gelingen, an die Session des vorher eingeloggten Users zu kommen (z. B. indem er den gleichen PC benutzt, auf dem noch der Cookie liegt), dann wird er auch damit eingeloggt sein. Deshalb ist es wichtig, dem Cookie ein gewisses Verfallsdatum mitzugeben (z. B. eine Stunde). Ansonsten wird er automatisch gelöscht, wenn man den Browser schließt (es sei denn du gibst ihm eine längere Laufzeit an).

Die Laufzeit von Session-Cookies kannst du über den php.ini-Parameter session.cookie_lifetime manipulieren ( http://de3.php.net/manual/en/ref.session.php ).

Außerdem sollte ein Logout-Button zur Verfügung stehen, damit der Benutzer selbst die Löschung des Cookies mit einem Mausklick veranlassen kann. (Dabei wird dann einfach session_destroy() aufgerufen).

Was du vielleicht schon weißt, ich aber der Vollständigkeithalber noch mal erwähne: Wenn der Browser des Anwenders keine Cookies annimmt (z. B. weil er sie deaktiviert hat), wird die Session-ID automatisch über die URL übertragen, was gemeinhin als unsicherer angesehen wird, jedoch kaum zu vermeiden ist (es sei denn, du baust eine Abfrage ein und erlaubst nur Benutzern mit aktivierten Cookies, sich auf deinen Seiten einzuloggen).
 
Zurück