Maulwurf_der_Schlaue Geschrieben 16. Mai 2006 Teilen Geschrieben 16. Mai 2006 Guten Abend, ich hab jetzt schon mehrere Tage versuch mit der Sessionverwaltung in PHP klar zu kommen. Irgendwie funktioniert das aber noch nicht so wie ich mir das vorstelle bzw. wie es eigentlich funktionieren sollte. Mein Problem ist das wenn ich eine Session starte dann funktioniert das (Anmeldeskript) wenn ich allerdings die Seite wechsel (innerhalb meiner Menüführung) dann verliehrt der die Daten wieder. Ich hab mir auch bei jedem aufruf mal die session-id ausgeben lassen war immer die selbe... zumindest im firefox.. 1.5.0.3. wer kann mir da wieterhelfen? zur info hab auch schon die suchfunktion benutzt nur leider hab ich nichts passendes gefunden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 16. Mai 2006 Teilen Geschrieben 16. Mai 2006 dein quellcode ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maiki1983VF Geschrieben 17. Mai 2006 Teilen Geschrieben 17. Mai 2006 kurzer Tipp: jedes Script, in dem du an die Session-Daten heran willst, sollte in der allerersten Zeile ein session_start(); stehen haben. Sonst könnte ich mir da keinen Fehler in der Art vorstellen. Bin auf den Source-Code gespannt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 17. Mai 2006 Autor Teilen Geschrieben 17. Mai 2006 Hallo, kann erst heut abend quellcode posten, kann aber erklären wie ich vorgegangen bin Seitenaufbau ist eine Tabelle, -------------------------------------------- | ..... | Login ...| -------------------------------------------- | Navi ... | Inhalt .......................| | .... | ..............................| -------------------------------------------- [/PHP] Im Bereich Login kann der Seitenbesucher seinen Usernamen und sein Kennwort eingeben und per "post" abschicken. Danach baut sich die Seite wieder auf. Der Loginbereich wird ersetzt und es steht der Username da. Klick ein User im Navigationsbereich auf einen Link so baut sich die seite wieder neu auf. Lediglich der Bereich "Inhalt" ändert sich. Leider verliert er beim neuladen auch schon wieder die Sessioninformationen. Sprich der Seitenbesucher wird, sofern er gerade angemeldet war, ausgeloggt. Die Tabellenstruktur ist in der index.php, in dieser lauten die ersten Zeilen [PHP] <?php session_start(); ?> <html> ... <body> <table> .. Tabellenstruktur siehe oben ... </table> </html>. Der Inhalt ändert sich über die GET-Variable menu.. zB. index.php?menu=news. Die einzelnen Tabellenbereich werden dann aus require './misc/news.php'; [/PHP] zusammengebaut. Zum Beispiel ruft ein User das Forum auf lädt es die Datei ./misc/forum.php und zeigt diese im Inhalts-Bereich an. Wählt ein User einen Navigationspunkt welche unterschiedlichen Inhalt beinhaltet, für normale und angemeldete User, und meldet sich dann an wird bei aktualisieren der Inhalt angezeigt, den ein angemeldeter User sehen kann. Klickt er aber erst nach der Anmeldung auf einen solchen Punkt ist die Session wieder weg. Session ID ist aber immernoch die selbe. echo $PHPSESSID; am Anfang. Hoffe das euch das weiterhilft. Leider kann ich den gesamten Quellcode nicht auswendig, wenn ihr aber spezielle Aktionen wissen wollt kann ich versuchen sie nachschreiben , ansonsten heute abend. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 17. Mai 2006 Teilen Geschrieben 17. Mai 2006 Session ID ist aber immernoch die selbe. echo $PHPSESSID; am Anfang. Wenn die SessionID die gleiche ist, ist die Session auch nicht weg Legst du die entsprechenden Daten überhaupt in die Session, oder sind die nur in Skriptvariablen? Das wäre nämlich auch eine Erklärung, warum trotz gleicher Session einfach keine Daten mehr da sind, wenn die Seite neu geladen wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 17. Mai 2006 Autor Teilen Geschrieben 17. Mai 2006 Hallo, folgendes: Meldet sich ein User an so wird in einer PHP-Datei eine ordnerstruktur tiefer die integrität der Daten geprüft. War alles in Ordnung werden die Daten angelegt. Ich habs zuerst mit $_SESSION['name'] = $anmeldename; versucht. Danach hab ich gelesen man soll Sessionvariablen mit register speichern, also hab ichs geändert register(anmeldename); was auch nicht dazu geführt hat das er sich die Daten merkt. Im aktuellen Vorgang steht der richtige Wert in den Variablen. ##Speicherung in variablen erfolgt ## ##Ausgabe zum Test ## echo "Anmeldename : " . $_SESSION['anmeldename'] . "<br>"; [/PHP] ich hab zuerst gedacht er verliert die Session-Id, deshalb hab ich sie in der Url mitgegeben: ...?menu=news&PHPSESSID=xxxxxxxx hat aber auch nichts gebracht, weshalb ichs dann wieder herausgenommen habe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 17. Mai 2006 Teilen Geschrieben 17. Mai 2006 $_SESSION ist absolut ausreichend und auch richtig. session_register (oder so) hat man mal ganz früher benutzt, zu Zeiten, als register_gobals noch vollkommen normal war # skript1.php <?php session_start(); $_SESSION["bla"] = "blubb"; ?> # skript2.php <?php session_start(); echo $_SESSION["bla"]; ?> Aufruf von Skript1 und danach Skript 2 sollte "blubb" ausgeben. Was hast du denn für einen Session Pfad gesetzt, oder für einen Session Name? Oder hast du da überhaupt was verändert? Also ohne deinen Code ist das sehr schwer nachzuvollziehen. EDIT: Ich habs zuerst mit $_SESSION['name'] = $anmeldename; versucht. ... ##Speicherung in variablen erfolgt ## ##Ausgabe zum Test ## echo "Anmeldename : " . $_SESSION['anmeldename'] . "<br>"; [/PHP] [/Quote] 'name' != 'anmeldename' Vielleicht ja aber auch nur n Fehler beim Schreiben hier... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 17. Mai 2006 Autor Teilen Geschrieben 17. Mai 2006 ... 'name' != 'anmeldename' ... nein in diesem Fall nicht. is aber blöd geschrieben von mir, weil ich zuerst geschrieben hab $_SESSION['name']. Das was du meinst bezog sich aber auf register(anmeldename), das zweite codefragment , sry mein fehler, hätt ich anders schreiben sollen ansonsten stimmt deine aussage schon bei mir gibt es keine index1.php und index2.php, lediglich eine index.php bei der je nach menüpunkt andere php-daten verarbeitet werden. index.php?menu=news => require './misc/news.php', welches im Inhalt-Teil der Tabelle verarbeitet wird (News-Daten). index.php?menu=forum => require './misc/forum.php', welches im Inhalt-Teil der Tabelle verarbeitet wird (Forum). Ich ändere nichts an den Einstellungen. Am Anfang meiner index.php rufe ich session_start() auf danach lese oder schreibe ich die Daten in $_SESSION. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schildi Geschrieben 17. Mai 2006 Teilen Geschrieben 17. Mai 2006 hallo ...du hast zwar keine index2.php aber doch eine news.php etc. die du includest, im beitrag vorher war glaube ich auch von skript2.php die rede, aber egal... dann kannst du doch in news.php das hier aus dem beispiel einfügen: # skript2.php <--- news.php <?php session_start(); echo $_SESSION["bla"]; ?> und dann sollte das doch funktionieren, oder bin ICH da jetzt auf dem Holzweg? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 17. Mai 2006 Autor Teilen Geschrieben 17. Mai 2006 Hallo, also ich glaube nicht das das hilft, denn am anfang wird die Session gestartet (in index.php), die einzelnen "includes" müssen doch nicht nochmal die Session_starten? der Server hat die Verarbeitung ja noch nicht gestoppt. Er füllt die Tabelle mit unterschiedlichen Werten. Solang er das macht muss ich doch nicht mittendrinn nochmal die Session starten. Rein theoretisch könnte ich ja alles in eine Datei schreiben. sprich es gibt nur die index.php und alles was ich "includen" will schreib ich in die index.php gleich mit rein. Also die gesamte news.php und forum.php Ich dachte mir halt das es aus übersichtlichkeitsgründen besser ist für grobe Funktionalitäten einen eigene *.php zu erstellen. in den anderen php-dateien steht nur <?php ## Code ohne ende ?> [/PHP] sprich ohne <html> </html> und sowas. weil das ja alles schon einmal gesendet wird, das mach ja die index.php. Nur in der index.php steht <html>...<body>....</body></html> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schildi Geschrieben 17. Mai 2006 Teilen Geschrieben 17. Mai 2006 was passiert denn wenn du, um im beispiel zu bleiben in die news.php einfach <?php echo $_SESSION["bla"]; ?> schreibst? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 17. Mai 2006 Autor Teilen Geschrieben 17. Mai 2006 Hallo, bin jetzt zuhaus und schreib hier mal ein wenig Quellcode in der Hoffnung jmd. kann mir dann helfen. index.php <?php @session_start(); echo $PHPSESSID."<br>"; require './functions.php'; $web_address = $_SERVER['SERVER_NAME']; $code = $HTTP_GET_VARS['menu']; $leer = " <br>"; if ($code == "logoff") { $_SESSION['logon'] = false; @session_destroy(); header("Refresh: 1; URL=\"http://$web_address\""); } ?> <html> <head> <title> Sessions-Test </title> <link rel='stylesheet' type='text/css' href='./settings.css'> </head> <body> <table border="0" width="100%" height="100px" > <tr> <td id="1" align="center" valign="middle"> <img src="./banner.jpg" height="100px"></td> <td id="2" width="335px" align="left" valign="middle"> <?php require './logon.php' ?> </td> </tr> </table> <table border="0" width="100%"> <td width="200px" align="center" valign="top"> <?php require './navi.php' ?> </td> <td align="left" valign="top" > <?php require './inhalt.php' ?> </td> </td> </tr> </table> </body> </html>[/PHP] inhalt.php [PHP] <?php if ($code == "reg") { require './misc/reg.php'; } else if ($code == "activate") { require './misc/activate.php'; } else if ($code == "help") { require './misc/kennwort.php'; } else if ($code == "users") { require './menu/users.php'; } else if ($code == "forum") { require './forum/index.php'; } else if ($code == "logoff") { output("$leer Du hast dich erfolgreich ausgeloggt!<br>Bitte warte einen kurzen Augenblick.<br>$leer",true,false); } else { $msg = "Kein Menüpunkt ausgewählt." textoutput($msg); } ?> chklogin.php (wird ausgeführt wenn jemand das forumlar mit den anmeldedaten abschickt.) <?php connect2db(); $query = "SELECT * FROM reg_user where nick=\"" . $nick . "\" and kennwort=\"" . $kennwort . "\""; $result = mysql_query($query); $rows = @mysql_num_rows($result); if ($rows == 1) { while($row = mysql_fetch_array($result)) { $nick = $row['nick']; $_SESSION('nick') = $nick; } } disconnectdb(); ?> [/PHP] Hoffe das genügt. Wie ihr vllt. seht ist es etwas umfangreicher, im Prinzip ist es immer das selbe. Kommt ein neuer Menüpunkt dazu brauch ich nur eine neue Post-Variable abfragen und in die entsprechende php-datei verweisen. Zur Funktion Output(); Parameter #1 Auszugebender Text #2 5 leere Zeilen als abstand ausgeben #3 Wenn ein Fehlertext dann soll danach beendet werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 17. Mai 2006 Autor Teilen Geschrieben 17. Mai 2006 Hallo nochmal, jetzt gehts.. danke für euere Hilfe. hab eine $_session('name') = $nick geschrieben man muss aber $_sesson['nick'] schreiben. ich glaub zumindest das es an dem gelegen hat, weiß allerdings nicht warum er da nicht schon eher einen fehler geworfen hat. naja jetzt gehts, danke nochmal für euere mühe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 18. Mai 2006 Teilen Geschrieben 18. Mai 2006 ich glaub zumindest das es an dem gelegen hat Ja, daran wird es gelegen haben, den $_SESSION ist ein Array und keine Funktion HAst du vielleicht error_reporting(E_NONE)? Dann zeigt er nämlich keine Fehler o.ä.. error_reporting(E_ALL) zeigt hingegen alle Warnungen, Hinweise etc. und ist bei der Fehlersuche manchmal sehr hilfreich. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 18. Mai 2006 Autor Teilen Geschrieben 18. Mai 2006 Guten Morgen, das mit den error_reporting(E_NONE) bzw. error_reporting(E_ALL) kannte ich nicht. Werd ich aber gleich mal einbauen. Damit es dann leichter von der Hand geht. Danke nochmal für eure Hilfe und Tips. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 18. Mai 2006 Teilen Geschrieben 18. Mai 2006 das mit den error_reporting(E_NONE) bzw. error_reporting(E_ALL) kannte ich nicht. Werd ich aber gleich mal einbauen. Aber auf produktiv Seiten sollte auf keinen Fall E_ALL stehen, besser E_NONE. Die Struktur deines Servers muss ja auch nicht jeder kennen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
rEmix Geschrieben 19. Mai 2006 Teilen Geschrieben 19. Mai 2006 ohne alles gelesen zu haben, aber so sollte das sicher gehen: in deine index.php ganz oben schon @session_start(); beim einloggen wird dann eine variable ($loggedin) auf true gesetzt. vor den teil, den man nur als "eingeloggter" sieht, machst ne simple if-anweisung hin (if $loggedin == true) { INHALT } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 19. Mai 2006 Autor Teilen Geschrieben 19. Mai 2006 Hallo, ich mach das mit isset(), wenn eine Session existiert dann gibt es auch eine Variable. <?php if (isset($name)) { ## interner Bereich } else { ## externer Bereich } ?> [/PHP] ist doch genauso sicher, abgesehen davon das Sessions allein nicht sicher sind Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 19. Mai 2006 Teilen Geschrieben 19. Mai 2006 ich mach das mit isset(), wenn eine Session existiert dann gibt es auch eine Variable. [...] ist doch genauso sicher :eek Das sieht doch absolut nach register globals aus? :eek Und das soll sicher sein? deineSeite.php?name=blubb und man ist in deinem internen Bereich! (Wenn dein Code keine spezielle sonstige Prüfung bzgl. Session drin hat) EDIT: if (isset($_SESSION["name"])) { #interner Bereich } else { #externer Bereich } Wäre, auf die schnelle, eine sichere Version deiner Logik. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 19. Mai 2006 Autor Teilen Geschrieben 19. Mai 2006 Hallo, so wie es in deinem EDIT: ist so hab ichs gemacht. Sonst macht es ja keinen Sinn. =). Die Variable ist ja nur da wenn die Session existiert Wünsch noch ein schönes Wochenende. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 19. Mai 2006 Teilen Geschrieben 19. Mai 2006 Sonst macht es ja keinen Sinn. =). Die Variable ist ja nur da wenn die Session existiert Irgendwie drückst du dich unklar aus. $_SESSION ist eine Variable und zwar ein (assoziatives) Array. $_SESSION["name"] ist ein Element dieses Arrays, aber keine Variable. $name ist eine Variable, und wenn register globals auf on steht (was es leider immer noch viel zu oft tut), wird diese Variable dann auch gefüllt (also globale Variable) mit dem Wert aus der Environment Variable, der Get-Variable, der Post-Variable, der Cookie Variable oder der Server-Variable (auch Session) (mit jeweils demselben Namen). Und zwar in der Reihenfolge (standardmäßig). Wenn schon vorhanden wird sie gegebenenfalls überschrieben. Dein Session-Wert steht damit als globale Variable $name zur Verfügung, du hast allerdings keine Chance zu sagen, woher der Wert kommt. Diese Methode war früher gang und gebe, kam aber wegen Sicherheitsbedenken sehr schnell ins Gerede. Seit PHP 4.2.0 ist das standardmäßig ausgeschalten, aber viele Skripte nutzen das noch, so dass es, gerade bei großen Webspace-Anbietern, immernoch an ist. Es ist auch damit möglich sicheren Code zu schreiben. Die Chance den Code unsicher zu schreiben vervielfacht sich aber extrem. siehe http://de.php.net/manual/de/security.globals.php Wenn du also von der Variable $name redest, gehe ich von der register globals Methode aus. Andernfalls solltest du vom Session-Wert (der Session-Variable oder sonst etwas) schreiben Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 22. Mai 2006 Autor Teilen Geschrieben 22. Mai 2006 Guten Morgen, danke für die Aufklärung, für mich waren das alles Variablen gewesen, bisher war mir das nicht so bewusst das es ein paar Ecken komplizierter ist. Ich wusste zwar das die $_Session sozusagen ein Array ist aber weiter hab ich mir da auch nicht gedanken drüber gemacht. Gibt es noch irgendwelche sicherheitstechnischen Hinweise auf die man Achten muss/sollte? (Stichworte sollten reichen). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 22. Mai 2006 Teilen Geschrieben 22. Mai 2006 Gibt es noch irgendwelche sicherheitstechnischen Hinweise auf die man Achten muss/sollte? (Stichworte sollten reichen). gibt es bestimmt genug Dinge, aber so auf anhieb, einfach ins Blaue, fällt mir dazu kein Stichwort ein. Für die einfache Benutzerauthentifizierung ber Session ist so grob gesehen (die 5 Zeilen Quelltext oben) eigentlich alles, was mit da jetzt auf- oder einfällt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 23. Mai 2006 Autor Teilen Geschrieben 23. Mai 2006 Guten Morgen, danke für die Hilfe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.