Archiv verlassen und diese Seite im Standarddesign anzeigen : Session Variable nur einmal wiederherstellbar
oelsi
27.10.2005, 22:27:23
Hallo,
habe mit Sicherheit ein ganz einfaches Problem.
Ich gebe über ein Formular Daten weiter:
<form action="index.php?pageid=adreg" method="post">
<tr><td width="100"><div class="small2" id="small2">user</div></td>
<td width="100"><input type="text" size="15" name="user" id="user" style="border-width: 1px; border-style: solid; border-color: RGB(56,133,89);"/></td></tr>
<tr><td><div class="small2" id="small2">password</div></td>
<td><input type="password" size="15" name="pw" id="pw"/></td></tr>
<tr><td colspan="2" height="10"></td></tr>
<tr><td colspan="2"><center><input type="submit" value="Check!"/></center></td></tr>
</form>
dann will ich die Daten mit folgendem Script auslesen und eine Session-Variable speichern:
session_start();
if(!isset($_GET["pageid"])){$pageid="home";}
else{$pageid=$_GET["pageid"];}
if(!isset($_SESSION["loggedin"])){$_SESSION["loggedin"]="false";}
if(isset($_POST["user"])&&isset($_POST["pw"])){
if($_POST["user"]=="user"&&$_POST["pw"]=="password"){$_SESSION["loggedin"]="true";}
}
Dieser Teil steht immer am Beginn der index.php. Dies funktioniert beim ersten Aufruf der Seite. Wenn ich allerdings wieder auf die index.php zugreife ist die $_SESSION["loggedin"] wieder verloren gegangen, obwohl immer session_start() am Anfang der Datei steht. Allerdings wird der PHP-Teil unterbrochen und die Variable erst in einem späteren Skript ausgewertet. Könnte es eventuell daran liegen oder liegt hier ein anderes Problem vor?
Danke! oelsi
oelsi
28.10.2005, 00:16:47
Nochmal hallo,
ich habe bis eben noch einmal ein wenig herumprobiert und habe dabei festgestellt, dass es bei mir mit Easy-PHP1.6 läuft, mit Easy-PHP1.8 allerdings nicht.
Könnte es also entweder ein Versionsproblem mit PHP5 oder im Setting der php.ini sein?
xabbuh
28.10.2005, 00:39:46
Was genau ist dieses Easy-PHP? Laufen die beiden Versionen auf unterschiedlichen Servern? Wenn ja, poste doch bitte mal für jede der beiden PHP-Konfigurationen die Ausgabe von phpinfo() (http://www.php.net/phpinfo). Möglicherweise liegt der Hund einfach in der Konfiguration begraben.
oelsi
28.10.2005, 01:19:54
EasyPHP ist ein Komplettpaket für eine lokale Entwicklungsumgebung. Das Programm konfiguriert automatisch den Apache-Server und stimmt die MySQL-Verbindungen mit ab. Version 1.6 hat meines Wissens noch PHP4.x während Version 1.8 schon PHP5 unterstützt.
Online auf dem Server läuft das Script übrigens auch, aber dennoch frage ich mich, warum es lokal nicht läuft. Will nur sicher gehen, dass ich vielleicht nicht irgendwo eine falsche Schreibweise verwende.
Ich poste jetzt nur die SESSION-Konfiguration. Hoffe das hilft, wenn du noch mehr Infos brauchst, sag einfach bescheid.
Konfig EasyPHP 1.6 (Website läuft):
Session Support --> enabled
Directive --> Local Value --> Master Value
session.auto_start --> Off --> Off
session.cache_expire --> 180 --> 180
session.cache_limiter --> nocache --> nocache
session.cookie_domain --> no value --> no value
session.cookie_lifetime --> 0 -->0
session.cookie_path --> / --> /
session.cookie_secure --> Off --> Off
session.entropy_file --> no value -->no value
session.entropy_length --> 0 --> 0
session.gc_maxlifetime --> 1440 -->1440
session.gc_probability --> 1 --> 1
session.name --> PHPSESSID --> PHPSESSID
session.referer_check --> no value --> no value
session.save_handler --> files --> files
session.save_path --> C:\Programme\EasyPHP\tmp\ --> C:\Programme\EasyPHP\tmp\
session.serialize_handler --> php --> php
session.use_cookies --> On --> On
session.use_trans_sid --> 1 --> 1
Und nun Konfig EasyPHP 1.8 (Session geht verloren):
Session Support --> enabled
Registered save handlers --> files user
Directive --> Local Value --> Master Value
session.auto_start --> Off --> Off
session.bug_compat_42 --> Off --> Off
session.bug_compat_warn --> On --> On
session.cache_expire --> 180 --> 180
session.cache_limiter --> nocache --> nocache
session.cookie_domain --> no value --> no value
session.cookie_lifetime --> 0 --> 0
session.cookie_path --> / --> /
session.cookie_secure --> Off --> Off
session.entropy_file --> no value --> no value
session.entropy_length --> 0 --> 0
session.gc_divisor --> 1000 --> 1000
session.gc_maxlifetime --> 1440 --> 1440
session.gc_probability --> 1 --> 1
session.name --> PHPSESSID --> PHPSESSID
session.referer_check --> no value --> no value
session.save_handler --> files --> files
session.save_path --> C:/Programme/EasyPHP18\tmp\ --> C:/Programme/EasyPHP18\tmp\
session.serialize_handler --> php --> php
session.use_cookies --> On --> On
session.use_only_cookies --> Off --> Off
session.use_trans_sid --> Off --> Off
Danke schon mal für deine Hilfe.
oelsi
|Coding
28.10.2005, 01:37:24
Kein Wunder das deine Session verloren geht. Schau dir das mal an:
session.save_path --> C:/Programme/EasyPHP18\tmp\ --> C:/Programme/EasyPHP18\tmp\
Ändere die Pfadangabe in der Config mal so ab:
session.save_path = "C:/Programme/EasyPHP18/tmp/"
xabbuh
28.10.2005, 09:21:05
Müsste die Pfadangabe unter Windows nicht auch mit Backslashes funktionieren?
Ich vermute eher, dass du Cookies deaktiviert hast. Dann liegt der Unterscheid nämlich hier:
session.use_trans_sid --> Off --> Off
Wenn session.use_trans_sid aktiviert ist, bedeutet dies, dass die Sessionid automatisch an Links angehängt wird, wenn kein Sessioncookie gesetzt werden konnte. Ist diese Option aber deaktiviert, muss die Sessionid vom Programmierer manuell durch anhängen der Konstanten SID übergeben werden, falls der Benutzer keine Cookies akzeptiert bzw. das Cookie aus irgendeinem anderen Grund nicht gesetzt werden konnte.
|Coding
28.10.2005, 11:51:34
Müsste die Pfadangabe unter Windows nicht auch mit Backslashes funktionieren?
Doch das schon, aber ich schätze mal der Mix ist der Haken. Nur Slashes oder nur Backslashes wäre vielleicht gesünder.
Aber mann sollte natürlich auch nicht die SID deaktivieren, wenn der User keine Cookies nutzt :-D
xabbuh
28.10.2005, 14:31:04
Doch das schon, aber ich schätze mal der Mix ist der Haken. Nur Slashes oder nur Backslashes wäre vielleicht gesünder.
Ok, das mag sein. Müsste man mal ausprobieren.
oelsi
28.10.2005, 15:22:57
Hallo xabbuh und |coding,
habe zuerst den session.use_path in allen möglichen Schreibformen probiert. Das allein hat das Problem nicht gelöst. Aber stimmt natürlich. Es war nicht besonders "sauber" gelöst.
Dann habe ich die session.use_trans_sid auf 1 gesetzt und jetzt läuft es.
Allerdings steht in der php.ini zu diesem Eintrag die folgende Warnung:
; trans sid support is disabled by default.
; Use of trans sid may risk your users security.
; Use this option with caution.
; - User may send URL contains active session ID
; to other person via. email/irc/etc.
; - URL that contains active session ID may be stored
; in publically accessible computer.
; - User may access your site with the same session ID
; always using URL stored in browser's history or bookmarks.
Stimmt das und wenn ja, gibt es eine sicherere Variante mit der Session zu arbeiten?
Vielen Dank euch Beiden!
oelsi
|Coding
28.10.2005, 16:13:36
Die Warnung bezieht sich darauf, das ein Fremder z.B. der Freund eines Users von selbigem eine E-Mail bekommt in der ein Link zu deiner Seite drin steht. Ist dem Link jetzt noch eine aktive Session angehängt, kann der Fremde die Seite betreten ohne sich anmelden zu müssen.
Dieses Sicherheitsrisiko besteht natürlich noch in anderen Situationen.
xabbuh
28.10.2005, 18:13:52
Die einzige Möglichkeit, dieses Risiko zu vermeiden, wäre es, session.use_trans_sid zu deaktivieren. Dafür müsste der Benutzer aber dann natürlich Cookies aktiviert haben.
meikel (†)
28.10.2005, 21:19:53
Stimmt das und wenn ja, gibt es eine sicherere Variante mit der Session zu arbeiten?
Arbeite mit Session Cookies.
session.use_cookies spezifiziert, ob das Modul Cookies verwendet, um die Session-ID clientseitig zu speichern. Grundeinstellung 1 (aktiviert).
session.use_only_cookies spezifiziert, ob das Modul nur Cookies verwendet, um die Session-ID clientseitig zu speichern. Grundeinstellung 0 (deaktiviert, für Rückwärts-Kompatibilität). Mit Aktivierung dieser Einstellung wird möglichen Angriffen durch Übermittlung von Session-IDs in URLs vorgebeugt. Diese Einstellung wurde in PHP 4.3.0 hinzugefügt.
Dann wird die session_id im Cookie gespeichert und wird nicht mehr in den URL breitgetreten.
Allerdings bleiben dann die DAUs, die, weil sie gerne Computer-BILD lesen, keine Kekse haben wollen, auf der Strecke.
oelsi
28.10.2005, 21:36:48
Vielen Dank für die Infos! Nur noch eine Frage: Besteht die "Gefahr" auch, wenn die Session durch session_destroy() beendet wurde? (Letzte Frage dazu, dann bin ich zufrieden! ;-)
xabbuh
28.10.2005, 21:53:23
Sobald du die Funktion session_destroy() aufrufst, werden alle Daten, die mit einer Session assoziiert werden, gelöscht. Somit kann ein Benutzer über die Sessionid nicht mehr an die vorher in der Session abgelegten Daten kommen.
meikel (†)
28.10.2005, 22:55:52
Besteht die "Gefahr" auch, wenn die Session durch session_destroy() beendet wurde?
Sowas ist nicht auszuschließen, da PHP die Sessionfiles nicht sofort löscht sondern erst dann, wenn mal Zeit ist.
Sicheres session_destroy:
$_SESSION = array(); # alle Indizes löschen
session_write_close(); # vorzeitiges Schreiben des Sessionfiles
session_destroy(); # zum Löschen vormerken
So sind zumindest die Sessiondaten weg, falls das File noch etwas länger lebt.
oelsi
28.10.2005, 23:42:27
Super vielen Dank! Hat mir sehr geholfen.
Bis bald! oelsi
vBulletin® v3.8.3, Copyright ©2000-2024, Jelsoft Enterprises Ltd.