Ich kenn das Problem mit TYPO3 - es ist das switchen des IEs in den Kompatibilitätsmodus. Dadurch ist die Session nicht mehr vorhanden und der User ausgeloggt.
Vielleicht hilft dieser Metatag:
<meta http-equiv="X-UA-Compatible" content="IE=8" />
Vielen Dank für Deine schnelle Antwort.
Das Problem konnte ich auf 2 verschiedenen Rechnern bis jetzt feststellen:
1x Windows Vista, IE8
1x Windows 7, IE 8.
Zunächst eine Erklärung zu meiner Seite:
Ich habe eine index.php, diese Inkludiert sowohl geschützte, als auch nicht geschützte unterseiten.
Die Index inkludiert auch meine Klasse (für das Loginsystem).
Index.php
Eine mögliche Inkludierte Datei sieht so aus:PHP-Code:// Während der Entwicklung...
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set( 'session.use_only_cookies', '1' );
ini_set( 'session.use_trans_sid', '0' );
// Befinden wir uns auf der Hauptseite, und wurde keine Sprache festgelegt, ermitteln wir die Browsersprache und leiten weiter.
if(sprache_nicht_festgelegt){
// ermitteln
header("HTTP/1.1 301 Moved Permanently");
header("Location: $weiterleitung");
header("Connection: close");
}
session_start();
require_once("system/class.myclass.php");
$obj = new obj();
if($obj->checkUser()===true){
// Nachricht für eingelogte anzeigen
}
else{
// wurde die Login-Seite inkludiert:
if(isset($_GET["web"]) && $_GET["web"]=="login"){
if (!isset( $_SESSION['server_SID'] )){
// Möglichen Session Inhalt löschen
session_unset();
// Ganz sicher gehen das alle Inhalte der Session gelöscht sind
$_SESSION = array();
// Session zerstören
session_destroy();
// Session neu starten
session_start();
// Neue Server-generierte Session ID vergeben
session_regenerate_id();
// Status festhalten
$_SESSION['server_SID'] = true;
}
$_SESSION['angemeldet'] = false;
$eingabe = array();
$anmeldung = false;
$update = false;
if(login_formular_wurde_abgeschickt){
$eingabe = $obj->cleanInput();
$anmeldung = $obj->loginUser($eingabe['username'],$eingabe['password']);
// Anmeldung war korrekt
if ($anmeldung){
// Benutzer Identifikationsmerkmale in DB speichern
$update = $obj->updateUser( $eingabe['username']);
// Bei erfolgreicher Speicherung
if ($update){
header( 'location: '.$sprache_des_besuchers.'/');
exit;
}
} // if-anmeldung
} // if-login-formular-abgeschickt
} // if-login-seite-aufgerufen
} // ELSE von $obj->checkUser()===true
// inkludieren von Content
include(".....");
PHP-Code:if($obj->checkUser()===true){
// eingelogt
}
else{
// alternativer Inhalt
}
Meine Klasse: class.myclass.php
Ich hoffe ich hab euch nicht mit dem Code erschlagen.PHP-Code:class obj{
// Hier hab ich nur die checkUser() jetzt Kopiert.. Hoffe das reicht?
public function checkUser(){
// Alte Session löschen und Sessiondaten in neue Session transferieren
session_regenerate_id( true );
if(isset($_SESSION['angemeldet'])){
if ($_SESSION['angemeldet'] !== true){
return false;
}
}
// Benutzerdaten aus DB laden
$sql = "SELECT `id`,`type` FROM `users` WHERE `username` = ? AND `block_stop`<NOW()";
$q = $this->db->prepare($sql);
$q->bind_param('s',$_SESSION['benutzername']);
$q->execute();
$q->store_result();
if ($q->num_rows == 1){
$q->bind_result($u_id,$u_type);
$q->fetch();
$q->free_result();
$sql = "SELECT `ip`,`user_info`,`anmeldung`, `last_active` FROM `user_session` WHERE `user_id` = ?";
$f = $this->db->prepare($sql);
$f->bind_param('i',$u_id);
$f->execute();
$f->store_result();
if ($f->num_rows == 1){
f->bind_result($ip,$user_info,$anmeldung,$last_active);
$f->fetch();
$f->free_result();
$last_active = strtotime($last_active);
if (long2ip($ip) != $_SERVER['REMOTE_ADDR']){ return false; }
if ($user_info != $_SERVER['HTTP_USER_AGENT']){ return false; }
if ($anmeldung != $_SESSION['anmeldung']){ return false; }
if (($last_active + 600) <= $_SERVER['REQUEST_TIME']){
return false;
}
}
else{
return false;
}
}
else{
return false;
}
// Wenn die Benutzerdaten okay sind
// Letzte Aktivität aktualisieren
$sql = "UPDATE `user_session` SET `last_active` = NOW() WHERE `user_id` = ? LIMIT 1";
$result = $this->db->prepare($sql);
$result->bind_param('i',$u_id);
$result->execute();
$this->user["id"] = $u_id;
$this->user["type"] = $u_type;
$this->user["username"] = $_SESSION['benutzername'];
// Status zurückgeben
return true;
}
}
Habe so gut es ging versucht alles zu Kommentieren.
Vielen Dank nochmals, besonders an Rizzo
Steffanie
Ich kenn das Problem mit TYPO3 - es ist das switchen des IEs in den Kompatibilitätsmodus. Dadurch ist die Session nicht mehr vorhanden und der User ausgeloggt.
Vielleicht hilft dieser Metatag:
<meta http-equiv="X-UA-Compatible" content="IE=8" />
TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
Hallo steffenk,
vielen Dank für Deinen Hinweis.
Habs eingebaut, jedoch keine Besserung...
Das Ganze hat ja schonmal bei mir funktioniert nur habe ich nicht gemerkt ab wann das ganze anfing zu spinnen.
Größere Änderungen an die ich mich jetzt spontan erinner ist, dass ich vorher nicht mit modrewrite gearbeitet habe... jetzt schon...
und vielleicht macht diese Zeile hier Probleme?
if(sprache_nicht_festgelegt){
// ermitteln
header("HTTP/1.1 301 Moved Permanently");
header("Location: $weiterleitung");
header("Connection: close");
}
session_start();
Gruß
steffanie
Hallo,
wo kommt denn das her? So wie es da steht ist sprache_nicht_festgelegt eine Konstante, auch wo $weiterleitung her kommt ist nicht ersichtlich. Der Code sollte zwar nicht ausgeführt werden, weil weder die Konstante noch die Variable irgendwo eine Zuweisung haben, aber wieso steht das dann im Code?
Du solltest ein paar try/catch Blöcke einbauen, damit Du siehst wo das Script aussteigt.
Hast Du auch mal das session_start ganz nach oben gesetzt, vor den Sprach-Check oder den Sprach-Check mal komplett auskommentiert?
Gehört nicht direkt zum Thema aber: Wenn Du eh mit OOP arbeitest und dabei Sessions benutzt, wieso dann nicht konsequent sein und eine Registry Klasse (Session Scope) verwenden?
Hmm... Ich mach mir erst mal 'nen Kaffee und versuche wach zu werden, vielleicht verstehe ich den Code dann besser.![]()
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
PHP Tutorials und kostenlose Scripts gibt's bei phpBuddy.eu
Follow phpBuddy on Twitter
LTFB - anfängerfreundliche Tutorials
.
Hallo
die Sache mit der Sprache hab ich hier absichtlich vereinfacht um nicht zu viel wirwarr zu schaffen
Die Sprachermittlung sieht wie folgt aus:
session_start() ist unter diesem Konstrukt.PHP-Code:
$prefix = "/priv/";
if($_SERVER["REQUEST_URI"] == $prefix){
if(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])){
$http_accept_language = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
}
else{
$http_accept_language = "en";
}
$sprache = substr($http_accept_language, 0, 2);
switch($sprache) {
case 'de': $weiterleitung = $prefix.'de/';break;
case 'en': $weiterleitung = $prefix.'en/';break;
default: $weiterleitung = $prefix.'en/';
}
header("HTTP/1.1 301 Moved Permanently");
header("Location: $weiterleitung");
header("Connection: close");
}
Nun... Ich habe leider noch nicht soo viel mit OOP in PHP gearbeitet, so dass ich Dein LoginSystem mit mysqli umgebaut, angepasst und in eine Klasse verpackt habe.Gehört nicht direkt zum Thema aber: Wenn Du eh mit OOP arbeitest und dabei Sessions benutzt, wieso dann nicht konsequent sein und eine Registry Klasse (Session Scope) verwenden?
Viele Grüße
Steffanie
Moin,
hmm, hast Du mal das mit der Sprache komplett auskommentiert und/oder das session_start ganz nach oben gesetzt? Gibt es vielleicht Einstellungen oder Tools (Anti-Virus, Firewall, Router, etc.) das die übertragenen Session Cookies nicht mag?
Du kannst auch mal das session_regenerate_id auskommentieren um zu sehen ob es damit etwas zu tun haben könnte. Es ist gerade schwer den Fehler ausfindig zu machen (Uhrzeit+Wein+keine Konzentration = schlecht debuggen), da ich dieses Phänomen selbst noch nicht hatte.
Was die Registry Klasse angeht, so kannst Du ja mal googlen oder wenn ich morgen daran denke und nicht zu faul bin, stelle ich mal ein Beispiel rein.
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
PHP Tutorials und kostenlose Scripts gibt's bei phpBuddy.eu
Follow phpBuddy on Twitter
LTFB - anfängerfreundliche Tutorials
.
Hi steffi09,
mit deinem Problem sind wir noch nicht weiter, aber ich habe mal einen kleinen Artikel bzgl. Registry Klasse zusammengeschustert und auf meiner Seite veröffentlicht. Vielleicht kannst Du, oder auch andere Mitleser, ja was damit anfangen.![]()
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
PHP Tutorials und kostenlose Scripts gibt's bei phpBuddy.eu
Follow phpBuddy on Twitter
LTFB - anfängerfreundliche Tutorials
.
Hallo,
sorry für meine späte Rückmeldung. War im Kurzurlaub
Das session_start habe ich ganz nach oben (nach den 2 Befehlen bzgl. php.ini) gesetzt.
Keine Besserung.
Habe hier aber das ganze auf einem anderen Rechner getestet (Windows XP IEund hier bleibe ich eingelogt...
Ich versch mal nachher noch Deine anderen Tips umzusetzen.. Melde mich dann wieder
Viele Grüße und danke nochmal
steffanie
Hallo,
ich hoffe, dass ihr alle gut reingerutscht seid. Dies hier ist ein Klasse Script. Bloß wie kann man es mit ihm realisieren, dass jeder User nur Zugriff auf sein spezielles Userverzeichnis hat?
Hallo und danke.
Wie man das realisiert? Einfach indem man prüft ob dem User Zugriff erlaubt ist!![]()
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
PHP Tutorials und kostenlose Scripts gibt's bei phpBuddy.eu
Follow phpBuddy on Twitter
LTFB - anfängerfreundliche Tutorials
.
Ich habe für jeden User ein gleichnamiges Unterverzeichnis angelegt. Nach erfolgreichem Login wird der User automatisch in sein Verzeichnis weitergeleitet. Soweit sogut. Wenn in einem anderen Userverzeichnis auch die geheim_login.php liegt habe ich mittels URL-Manipulation auch Zugriff darauf. Das möchte ich aber vermeiden.
- Session starten
- Erfolgreiche Anmeldung: Benutzername in $_SESSION['benutzername'] schreiben
- Benutzer in sein Verzeichnis umleiten, das den gleichen Namen wie der User hat
- Im Verzeichnis den Benutzername in der Session mit dem Verzeichnisname vergleichen
So kann man aber nur Dateien schützen die PHP ausführen können. Download Dateien deren Name man kennt sind so nicht geschützt.PHP-Code:// Im Verzeichnis des Benutzers
session_start();
$verzeichnisname = array_pop( explode( "/", dirname( __FILE__ ) ) );
if ($_SESSION['benutzername'] != $verzeichnisname)
{
header( 'location: http://www.deine-seite.tld/login.php' );
exit;
}
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
PHP Tutorials und kostenlose Scripts gibt's bei phpBuddy.eu
Follow phpBuddy on Twitter
LTFB - anfängerfreundliche Tutorials
.
Hmm. Das ist mir jetzt auch klar geworden. Schade, ich wollte für Freunde und Family was zusammenbasteln, womit man Bilder und Sonstiges ablegen kann.![]()
Hallo zusammen
und vielen Dank schon einmal für Dein Tutorial Rizzo!
Ich würde, wie mein Vorredner auch, gerne mit mehreren Usern arbeiten. Wie stelle ich das am besten an? Muss man da wirklich über die Ordner gehen? Und nach welchen Kriterien überprüfe ich den aktuellen User?
Ich brauche keinen fertigen Code (höchstens Pseudocode), der mir zeigt, wie ich das mache...
Vielen Dank schon einmal im Voraus!
Hallo,
bitte!
Kann man so pauschal nicht beantworten, da es unterschiedliche Lösungen für unterschiedliche Situationen gibt. Eine Rolle spielt, was man schützen möchte (Dateien oder Seiten); wer wann wo Zugriff haben soll; gibt es mehrere User die gemeinsamen Zugriff auf bestimmte Bereiche haben (dann arbeitet man mit Gruppen); usw.
Je nach Situation uns gewünschtem Ergebnis muss man die DB erweitern und Gruppen hinzufügen, denen man wiederrum User zuordnet. Man kann auch einzelne Seiten, die aus der DB kommen, mit einer Art User-Whitelist schützen.
Nach welchen Kriterien man prüft? Session, Cookies, HTTP_Auth, da gibt es verschiedene Möglichkeiten.
Wie erwähnt, dass kann sehr individuell sein und hängt von der Situation und dem Ziel ab. Eine Aussage wie z.B. "will das eben schützen" ist viel zu wischiwaschi, als das man das sinnvoll beantworten könnte.![]()
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
PHP Tutorials und kostenlose Scripts gibt's bei phpBuddy.eu
Follow phpBuddy on Twitter
LTFB - anfängerfreundliche Tutorials
.
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)