Zum Inhalt springen

[PHP 5.xx] Sessions


Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

$_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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

...

'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 :P

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 }

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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).

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...