PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Booleanwerte in Sessionvariablen


frerd
03.07.2009, 15:21:14
Ich brauche eure Hilfe!

Ich bastel mir gerade eine private Homepage auf der ich meinen Verwandten die Urlaubsbilder zum Betrachten einstellen möchte. Dazu brauch ich ein Login-System und möchte dies über Sessions ermöglichen.

Zunächst habe ich eine Seite main.php mit dem Login-Formular (Post-Methode), anschließend wird login.php aufgerufen. Dort wird eine Session gestartet (funktioniert) und eine Session-Variable 'eingelogt' angelegt (funktioniert) und mit 'false' belegt (ohne Anführungszeichen, es erfolgt keine Fehlermeldung). Anschließend werden Benutzername und Passwort geprüft und bei Übereinstimmung wird die Sessionvariable 'eingelogt' mit 'true' belegt (ohne Anführungszeichen, es erfolgt keine Fehlermeldung) und auf die Seite 'start.php' weitergeleitet (header mit Session-ID). Innerhalb von 'start.php' wird über 'include' die Datei 'testlogin.php' aufgerufen. Mit ihr soll geprüft werden, ob ein erfolgreicher Login stattgefunden hat - also ob die Session-Variable 'eingelogt' existiert und mit 'true' belegt ist. Abfrage lautet: if(!isset($_SESSION['eingelogt'])||!$_SESSION['eingelogt']). Wenn nun die Variable 'eingelogt' nicht existiert oder nicht mit 'true' belegt ist, dann wird man wieder per Header auf 'main.php' weitergeleitet.

Problem ist nun. Die Session wird korrekt angelegt und auch die Session-Variable 'eingelogt'. Die Variable wird auch als Booleanwert erkannt, da in der Session-Datei folgendes steht: 'eingelogt|b:1:'. Allerdings steht nach dem zweiten Doppelpunkt kein Wert und somit wird 'eingelogt' niemals 'true'. Wenn ich hingegen beim Belegen der Variable die Anführungszeichen verwende, dann steht und der Datei: 'eingelogt|s:4:"true". Der Wert wird also als String interpretiert und die Abfrage ob wird immer wahr sein, egal oben dort "true" oder "false" drinsteht.

Was mache ich falsch? Ich muss dazusagen im Phase-5-html-Editor wird false und true nicht als Schlüsselwort markiert, aber bei einfacher Abfrage - $a=true; if(!$a) - korrekt behandelt.

cortex
03.07.2009, 15:29:23
kenne den restlichen quelltext nicht, aber vielleicht hilft das:

if(!isset($_SESSION['eingelogt']) and !$_SESSION['eingelogt'])

reichen sollte auch:

if(!isset($_SESSION['eingelogt']))

cx

anmerkung:

isset( $x ) gibt FALSE zurück, wenn $x = null

cx

frerd
03.07.2009, 15:38:29
Das Problem ist wohl weniger die Abfrage, sondern eher, dass die Session-Variable weder mit 'true' noch mit 'false' belegt ist. Zumindestens, wenn ich in die Sessiondatei schaue, denn dort steht nur:

eingelogt|b:1: -> eingelogt=Variablen-Name, b=Booleanwert, 1=Länge

Gegenbeispiel:

eingelogt|s:4:"true" -> eingelogt=Variablen-Name, s=Stringwert, 4=Anzahl der Zeichen, "true"=Wert

DokuLeseHemmung
03.07.2009, 15:44:38
b:0; ist false
b:1; ist true

Das ist schon korrekt so!
Du hast dich in deinem Postig allerdings mit : und ; vertan

R. Woitaschik
03.07.2009, 15:44:52
Hi frerd,
der Ausdruck b:1 in der Session-Datei ist korrekt. Bedeutet "b" = boolean und 1 = true. Bei false würde hier 0 stehen. Ich kann mir nur vorstellen, das deine Session in dem Testscript nicht ankommt. Gib doch bitte in der Datei start.php den Inhalt der Session-Variablen mittels
print_r $_SESSION; aus. Dann kannst Du sehen, ob die Variable richtig belegt ist.
Gruß
Richard

frerd
03.07.2009, 16:07:32
Hi Woitaschik!

Habe deine Rat befolgt. Die Ausgabe lautet wie erwartet 1. Habe dann noch die Session-Variable an $a übergeben und die Abfrage if(!$a) ausgeführt mit der Ausgabe 'FALSE' bei falsch und 'TRUE' bei wahr, Ausgabe 'TRUE'.

Die Variable wird also korrekt übergeben.

Hier mein Login-Skript:

<?php
$logintime=time();

//Session-ID erzeugen (rand()<-Zufallszahl, uniqid()<-ID erzeugen, md5()<-ID verschlüsseln

$token1=md5(uniqid(rand(),true));
$token2=md5(uniqid(rand(),true));

$token3=md5(uniqid(rand(),true));
$token4=md5(uniqid(rand(),true));

$zufall1=$token1.'-'.$token2;
$zufall1=md5($zufall1);

$zufall2=$token3.'-'.$token4;
$zufall2=md5($zufall2);

$sessiid=md5($zufall2.$zufall1); //eigentliche Session-ID erzeugen

session_id($sessiid); //Session-ID setzen
session_start(); //Session mit Session-ID starten

// diverse Session-Variablen setzen und belegen

$_SESSION['zeit']=$logintime; //Startzeit in Session-Variable "zeit" speichern
$_SESSION['eingelogt']=false; //Session-Variable "eingelogt" auf false setzen
$_SESSION['s_id']=session_id(); //Session-Variable "s_id" mit der Session-ID belegen
$s_name=session_name();
$s_id=session_id();

$benutzer=$HTTP_POST_VARS['benutzername']; //Benutzername in Variable schreiben
$pass=$HTTP_POST_VARS['passwort']; //Passwort in Variable schreiben
$status=0; //Berechtigung auf falsch setzen
$hostname=$_SERVER['HTTP_HOST']; //Hostname ermitteln
$pfad=dirname($_SERVER['PHP_SELF']); //Hostpfand ermitteln
$userdatei='user.csv';
$bol=file_exists($userdatei); //Existiert die Datei 'user.csv'?
if($bol) {
$datei=fopen($userdatei,"r"); //Wenn ja, dann öffnen zum lesen
if($datei) { //Wurde die Datei geöffnet?
$dateigroesse=filesize($userdatei); //Dateigröße ermitteln
while(($data=fgetcsv($datei,$dateigroesse,";"))!=false) { //Zeile für Zeile einlesen
if($benutzer==$data[0]) { //Stimmt der Benutzername mit einem Datensatz überein?
$status=1; //Wenn ja, dann Berechtigung auf richtig setzen
break; //Schleife beenden
}
}
fclose($datei); //Datei schließen
}
}
if($status==1) { //Ist die Berechtigung richtig?
if($data[0]==$benutzer) { //Nochmals Benutzername prüfen
if($data[1]==$pass) { //Stimmt Passwort mit Datensatz überein?
$_SESSION['eingelogt']=true;

$test=file_exists('logins.txt');
if($test) {
$offen=fopen('logins.txt','r');
if($offen) {
$groesse=filesize('logins.txt');
$logins=fread($offen,$groesse);
fclose($offen);
}
}
$logins++;
$test=file_exists('logins.txt');
if($test) {
$offen=fopen('logins.txt','w');
if($offen) {
$output=fwrite($offen,$logins);
fclose($offen);
}
}

include('sicherheit.php'); //Session-Sicherheit erzeugen

$_SESSION['codezeit']=$zeitpunkt;
$_SESSION['code']=$code;

header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/start.php?'.$s_name.'='.$s_id); //Wenn ja, dann zur Homepage weiterleiten
exit;
}
else {
session_unset();
session_destroy();
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php'); //Wenn nicht, dann zurück?
exit;
}
}
else {
session_unset();
session_destroy();
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php'); //Wenn nicht dann zurück?
exit;
}
}
else {
session_unset();
session_destroy();
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php'); //Wenn nicht, dann zurück?
exit;
}

?>

und das Skript testlogin.php

<?php
session_start();

$hostname=$_SERVER['HTTP_HOST'];
$pfad=dirname($_SERVER['PHP_SELF']);
$s_name=session_name();
$s_id=session_id();
if(strpos($pfad,'hp/')>0) {
$pfad=substr($pfad,0,(strpos($pfad,'hp/')+2));
}

if(!isset($_SESSION['eingelogt']) || !$_SESSION['eingelogt']) {
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php');
exit;
}
else {
if($_SESSION['codezeit']<$_SESSION['zeit'] or $_SESSION['codezeit']>time()) {
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php');
exit;
}
else {
$bol=file_exists('sicherheit.csv');
if($bol) {
$datei=fopen('sicherheit.csv','r');
if($datei) {
$dateigroesse=filesize('sicherheit.csv');
$status=false;
while(($data=fgetcsv($datei,$dateigroesse,';'))!=false) {
if($_SESSION['codezeit']==$data[0]) {
if($_SESSION['code']==$data[1]) {
$status=true;
break;
}
}
}
fclose($datei);
}
}
}
}
if($status==false) {
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php');
exit;
}
?>

Wo liegt jetzt der Fehler?

[mod: benutze bitte die code-Tags zur quellcode-Formatierung]

.

DokuLeseHemmung
03.07.2009, 16:24:49
Fürchterlicher Code !!!

Was hampelst du das mit der SessionID rum? Das kann PHP auch alleine.

Schon von Funktionen und include gehört?
Damit kannst du dir sicherlich die meisten der unsäglichen Weiterleitungen ersparen.


// voll überflüssig
$_SESSION['s_id']=session_id();

Alles in allem: Undurchblickbar(für mich)

frerd
06.07.2009, 11:29:54
Danke für eure schnelle Hilfe.

Habe den Fehler gefunden und behoben. Er hat sich an einer vollkommen anderen Stelle versteckt.