Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Login und Logout

Frage Entwicklung PHP

Mitglied: Mitchell

Mitchell (Level 2) - Jetzt verbinden

30.06.2009, aktualisiert 14.01.2012, 8106 Aufrufe, 12 Kommentare, 2 Danke

Session will nich beendet werden.

Hallo Leute,

ich habe hier ein Problem mit einem Logout-Skript, bei dem die Session einfach nicht beendet werden will. Wobei man beenden wohl nicht sagen kann, eher wird sie immer wieder direkt aufgerufen. Hier erstmal Code mit Erklärung:


Das ist der relevante Teil beim Login, vorher erfolgt natürlich noch Vergleich von Benutzerangaben usw. Der Login funktioniert eigentlich einwandfrei.
01.
02.
 
03.
			$_SESSION['angemeldet'] = 1; 
04.
 
05.
			setcookie ("PHPSESSID",$row['user'],time()+7 * 86400,"/"); 
06.
 
07.
			header ('Location: ../mein_index.php'); 
08.
 
09.
}
Hier der Check, ob der Benutzer eingeloggt ist, funktioniert auch:
01.
function logged_in() { 
02.
 
03.
	if ($_SESSION['angemeldet'] == 1) { 
04.
 
05.
		return(true); 
06.
 
07.
	} else
08.
 
09.
		return(false); 
10.
 
11.
12.
 
13.
 
14.
 
15.
}
Und nun der Logout, der irgende nicht so richtig will:
01.
function logout() { 
02.
 
03.
	setcookie("PHPSESSID", '', time()-42000, '/'); 
04.
 
05.
	session_unset($_SESSION['angemeldet']); 
06.
 
07.
	return session_destroy(); // gibt bei Erfolg true zurŸck 
08.
 
09.
}
Nun passiert also folgendes: Der User kommt auf die Seite und loggt sich ein, prima. Cookie wird gesetzt, Session "angemeldet" ist auch da. Nun will ich mich ausloggen und die Seite mit eben nur dieser Funktion logout wird aufgerufen. Das Cookie ist weg, die Session aber nicht. Wenn ich nun per URL-Manipulation auf einen geschützten Bereich zugreife, der per logged_in abgefragt wird, komme ich dort rein. Per "echo" sehe ich auch, dass sowohl das Cookie, als auch die Session wieder da sind. Testweise habe ich Cookies mal komplett deaktiviert, weil ich dachte, dass vielleicht irgendwas immer geladen wird (obwohl ja gelöscht). Dem ist aber nicht so, denn auch ohne Cookies komme ich immer wieder in meine geschützten Bereiche. Browser schließen, also Sessionablauf, bringt nichts. Die ist einfach immer da.

Was ich beim Logout schon probiert habe:

session_name('angemeldet');
session_unset;
session_destroy;
$_SESSION = array();
session_destroy();
---
session_unset($_SESSION['angemeldet]);
session_destroy();


Es hat alles Nichts geholfen, weiß jemand Rat?

Mfg

Mitchell
Mitglied: Dani
30.06.2009 um 23:04 Uhr
Hi Mitchell,
ich habe die Logoutfunktion gar nicht so geschrieben. Bei mir ist es einfach eine Art Modul:
01.
<?php 
02.
@session_start(); 
03.
include_once ("inc/header.php"); 
04.
 
05.
session_destroy(); 
06.
session_unset($_SESSION); 
07.
$_SESSION=array(); 
08.
 
09.
echo "<meta http-equiv='refresh' content='2; URL=index.php'>"; 
10.
?>
So sollte es auch bei dir gehen...kommt auch vllt. ein bisschen auf die PHP Version an.


Grüße,
Dani
Bitte warten ..
Mitglied: Mitchell
01.07.2009 um 10:50 Uhr
Hi Dani,

außer dem Header habe ich das schon ausprobiert, siehe oben. Aber ich habe auch mal dein Skript laufen lassen, leider nichts . Ich werde hier noch wahsinnig, in jedem verdammten Manual bzw. Buch steht, dass eine Session mit:

01.
session_start(); 
02.
$_SESSION = array(); 
03.
session destroy();
bzw. bei benannten Sessions mit

01.
session_name('name'); 
02.
session_start(); 
03.
session_unset(); 
04.
sessiion_destroy();
beendet wird, warum dann bei mir nicht?

Mfg
Mitchell
Bitte warten ..
Mitglied: Arano
01.07.2009 um 12:06 Uhr
Moin moin

Der Login funktioniert eigentlich einwandfrei.
Hm... scheint mir besser zu funktionieren als er sollte !

Was machst du eigendlich mit dem Cookie ?
Wirst du vielleicht über den immer wieder eingeloggt ?

Warum überschreibst du die PHP-Session-Id in dem Cookie mit einem Benutzernemen ?
Wie kommts, das trotz überschriebener (falscher) Session-Id die Session auf dem Server wiederhergestellt wrden kann ?

Funktioniert dein Login vieleich überhaubt nicht ?


~Arano
Bitte warten ..
Mitglied: masterG
01.07.2009 um 13:15 Uhr
Normales Logout script bei mir:

01.
<?php 
02.
session_start(); 
03.
setcookie ("PHPSESSID", "", time() - 3600); //Damit verfällt der cookie 
04.
session_destroy(); 
05.
header("Location: index.php"); 
06.
?>
wozu unset($_SESSION) ?. session_destroy(); macht das schon.
Bitte warten ..
Mitglied: Mitchell
01.07.2009 um 18:48 Uhr
@masterG

Das session_unset(); war auch nur ein Test, weil es vorher nicht klappte.

@Arano
Hm... scheint mir besser zu funktionieren als er sollte !
wie meinst du das? Deine letzte Frage muss ich nämlich nach mehreren Versuch doch verneinen, ich hab mich wohl von den "echo" Meldungen in die irre führen lassen. Stimmt, der Login funktioniert nicht, aber warum? Ich habe mein altes Skript nochmal eingespielt, weils mit dem neuen nicht klappte, müsste aber im Prinzip das selbe sein:

relevanter Teil vom Login ist gleich, aber das Cookie hab ich rausgenommen.

Der Check:

01.
function logged_in() 
02.
03.
	if ($_SESSION['angemeldet'] != true) 
04.
05.
	echo "Du bist NICHT angemeldet"
06.
07.
}
und der Logout:

01.
02.
	session_name('angemeldet'); 
03.
	session_unset();  // bzw. $_SESSION = array(); 
04.
	session_destroy(); 
05.
}
Was machst du eigendlich mit dem Cookie ?
das wird ab PHP 4xx automatisch gesetzt
Wirst du vielleicht über den immer wieder eingeloggt ?
Den Verdacht hatte ich auch, daher erstmal ganz weg.
Warum überschreibst du die PHP-Session-Id in dem Cookie mit einem Benutzernemen ?
weil ich eine benannte Session will.
Wie kommts, das trotz überschriebener (falscher) Session-Id die Session auf dem Server wiederhergestellt wrden kann ?
gerade das will ich ja herausfinden.

Da aber der Login schon nicht funktioniert, sind die Fragen oben erstmal Nebensache. Ich tüftel mich hier zu Tode, das kann doch nich so schwer sein. Ich habe ja schonmal einen Login geschrieben, sowas vergisst man doch nicht


Mfg

Mitchell
Bitte warten ..
Mitglied: Arano
02.07.2009 um 02:20 Uhr
Hm hm...

Du scheinst da grundsätzlich was durcheinander zu bringen ...glaube ich :D

Auf der einen Seite möchtest du eine benannte Session (mit dem Benutzernamen) "login()" und
auf der anderen Seite willst du immer NUR die Session "angemeldet" "logout()" beenden.
So würde die benannte Session (mit dem Benutzernamen) immer bestehen bleiben was einen erneuten login zu folge hätte trotz vermeindlichem logout.

Dazu kommt noch das du so die Session nicht umbenennst sondern lediglich ungültig machst den:
Für eine benannte Session müsstest du, sofern ich das Manual eben richtig überflogen habe, "session_name()" vor "sesssion_start()" aufrufen:
01.
<?php 
02.
  session_name('wasserrohrbruch'); 
03.
  session_start(); 
04.
   
05.
  echo 'Diese Session heisst: "'.session_name().'"<br>'
06.
  // Ausabe: Diese Session heisst: "wasserrohrbruch" 
07.
?>
Das Gegenstück zum logout:
01.
<?php 
02.
  session_start(); // Der Sessionname (id) wird aus dem Cookie gezogen) 
03.
  session_unset(); 
04.
  session_destroy(); 
05.
?>
Bei dir lief es glaube ich so ab:
    • Session wird gestartet und heisst:" 16df4g5s61d6g516df16sfhj6j"
    • Session-Id im Cookie wird mit dem Benutzernamen überschrieben: "Arano"
    • Session soll gelöscht werden: "angemeldet"
Daraus resultiert: die Session " 16df4g5s61d6g516df16sfhj6j" bleíbt unverändert und __bestehen__ erneuter login durch selbige.

Sollte ich mich irren, tschuldigung

Und vielleciht doch mal etwas mehr vom Script preisgeben, z.B: den login vorgang von dem ausser dir och keiner weiss wie der aussieht - ob wohl diese eine potentielle Fehlerquelle sein kann ;)


So, gehe erst mal pennen, hatten nen Sprenkleranlagen__wasserrohrbruch__ in Lager...
~Arano
Bitte warten ..
Mitglied: Mitchell
02.07.2009 um 21:11 Uhr
Hi Arano,

das session_name(); wird beim Login doch gesetzt oder täusche ich mich da. Jedenfalls hab ich es auch schon damit probiert, habs nur zur Übersicht nochmal rausgenommen, es stand jedenfalls schon in JEDEM Skript:
01.
seesion_name('angemeldet); 
02.
session_start();
Und ich weiß immernoch nicht, wie du auf eine Session mit Username kommst. Ich dachte, du meinst "angemeldet", aber scheinbar hatten wir da aneinander vorbeigeredet, sorry für den Irrtum . Es gibt jedenfalls nach dem vermeindlichen Login, oder was immer momentan ausgeführt wird, eine Session angemeldet, das lasse ich mir per ECHO-Befehl auf jeder Seite ausgeben. Nur was ich nicht begreife - und damit hat das Ganz wohl zu tun (denke ich mal) - ist, dass die globale Variable $_SESSION['angemeldet'] leer bleibt, obwohl ich doch beim Login per
01.
$_SESSION['angemeldet'] = 1;
was reinschreibe, oder hab ich mich da völlig vertan? Ich dachte, es liegt vielleicht an der 1 bzw. dem True-Wert. Aber selbst, wenn ich irgendwas reinschreibe ("hier bin ich"), bleibt die globale Variable leer.

z.B: den login vorgang von dem ausser dir och keiner weiss wie der aussieht...
steht doch oben, aber hier dann mal die komplette Funktion mit Abfragen:

01.
function login() 
02.
03.
// SQL CONNECT 
04.
 
05.
include ("sql_user.inc.php"); 
06.
$sql = mysql_query("SELECT user, passwort, register FROM benutzer WHERE user = '$_POST[benutzername]' AND passwort = MD5('$_POST[pass]')"); 
07.
$row = mysql_fetch_array($sql); 
08.
 
09.
	if (isset($_POST['send'])) 
10.
	if ($row['register'] == '0'
11.
12.
	echo "Dein Account wurde noch nicht freigeschaltet, bitte klicke nochmal auf den Aktivierungslink in der E-Mail oder kontaktiere den Webmaster"
13.
14.
	elseif (!$row
15.
16.
	echo "Du konntest nicht angemeldet werden, bitte &uuml;berpr&uuml;fe deine Eingabe"
17.
18.
	elseif (strtolower($_POST['benutzername']) == strtolower($row['user']) && md5($_POST['pass']) == $row['passwort']) 
19.
20.
	session_name('angemeldet'); 
21.
	$_SESSION['angemeldet'] = 'its me'
22.
	header ('Location: ../mein_index.php'); 
23.
24.
	else 
25.
26.
	echo "Es ist ein Fehler aufgetreten, bitte kontaktiere den Webmaster"
27.
28.
}
und hier noch der PHP-Teil in der "mein_index" (wird direkt am Anfang geschrieben, danach kommt nur noch HTML), in die NICHT eingeloggt wird:

01.
<?php 
02.
	include ("./data/functions.inc.php"); 
03.
	logged_in(); 
04.
echo $_SESSION['angemeldet']." ist die globale Session"."<br>"
05.
echo session_name()." ist der Sessionname"
06.
?>
Habe übrigens sowohl in "mein_index", als auch in der "login()-Funktion" schon session_name('angemeldet'); gefolgt von session_start(); getestet...ohne Erfolg.

Mfg
Mitchell
Bitte warten ..
Mitglied: 79754
13.07.2009 um 09:14 Uhr
Moinsen
Das ist hier alles gerade sehr verwirrend, will dennoch mal versuchen, etwas bei zu steuern. Deshalb hier mal eine meiner Kreationen.
Ich denke, es liegt daran, wie die Session aufgebaut wird.

Immer beachten!!
session_start() erzeugt eine Session oder nimmt die aktuelle wieder auf. Wenn eine benannte Session verwendet wird, muss session_name() aufgerufen werden, bevor session_start() aufgerufen wird.

Per Formular sende ich Login Informationen an folgendes Scripts. Dort baue ich dann die Session auf.
01.
<?php 
02.
session_start (); 
03.
include_once ('inc_conf/cl_db_mysql.inc.php'); 
04.
include_once ('inc_conf/cl_db.inc.php'); 
05.
include_once ('inc_conf/common.inc.php'); 
06.
 
07.
$db = new db; 
08.
$array_ergebnis = $db->execute("SELECT Id, Nickname, Nachname, Vorname, Akt FROM benutzerdaten WHERE Nickname = '".$_REQUEST["name"]."' AND Kennwort = '".md5 ($_REQUEST["pwd"])."'"); 
09.
if($db->num_rows()>0) 
10.
11.
    foreach($array_ergebnis as $zeile
12.
13.
        $_SESSION["user_id"] = $zeile["Id"];  
14.
        $_SESSION["user_nickname"] = $zeile["Nickname"];  
15.
        $_SESSION["user_nachname"] = $zeile["Nachname"];  
16.
        $_SESSION["user_vorname"] = $zeile["Vorname"]; 
17.
        $_SESSION["akt"] = $zeile["Akt"]; 
18.
        $_SESSION["admin"] = $zeile["Admin"]; 
19.
        if ($_POST["pagelogin"] == 'gaestebuch')  
20.
          {  
21.
            header ("Location: ?seite=gaestebuch"); 
22.
23.
        if ($_POST["pagelogin"] == '[cd]picture_vw')  
24.
          {  
25.
            header ("Location: ?seite=[cd]picture_vw"); 
26.
27.
28.
29.
else  
30.
  {  
31.
    error('Nickname oder Kennwort nicht korrekt!'); 
32.
33.
unset($db); 
34.
?> 
Das folgende Script prüft, ob ein Benutzer angemeldet ist.

01.
<?php  
02.
  session_start ();  
03.
  if (!isset ($_SESSION["user_id"]))  
04.
05.
      include 'inc_conf/formular.inc.php'
06.
07.
  else 
08.
09.
      if ($_SESSION['akt'] == '0'
10.
11.
          echo "<p>Ihr Account wird noch überprüft und ist noch nicht aktiviert. Bitte haben Sie Geduld.</p>"
12.
          session_start (); 
13.
          session_unset ();  
14.
          session_destroy (); 
15.
          echo "<a href='?seite=start' target='_self'>Hier gehts weiter!</a>"
16.
17.
      else 
18.
19.
           bla bla.... 
20.
?> 
Und hier mein Logout

01.
<?php  
02.
session_start ();  
03.
session_unset ();  
04.
session_destroy ();  
05.
echo "<h2>Logout</h2><p>Sie haben Sich erfolgreich abgemeldet.</p>"
06.
if ($_REQUEST["pagelogout"] == 'gaestebuch')  
07.
  {  
08.
    echo "<a href='?seite=gaestebuch' target='_self'>Hier gehts weiter!</a>"
09.
10.
if ($_REQUEST["pagelogout"] == '[cd]picture_vw')  
11.
  {  
12.
    echo "<a href='?seite=start' target='_self'>Hier gehts weiter!</a>"
13.
14.
?> 
Bitte warten ..
Mitglied: Mitchell
15.07.2009 um 10:55 Uhr
Hi SpankyHam,

ich danke dir für dein Skript. Aber leider sehe ich den großen Unterschied nicht. Also natürlich sehe ich den Unterschied zu meinem Skript, aber vom Sessionablauf her müsste es doch das gleiche sein. Vorallem ist dein Logout im Prinzip wie meiner aufgebaut, nur bei mir klappts nicht. Auch werden bei dir wohl die Daten in die globale Varible geschrieben, ich sehe einfach den Fehler nicht.

Mfg

Mitchell

PS: session_name() vor session_start ist bekannt, siehe oben
Bitte warten ..
Mitglied: 79754
15.07.2009 um 11:48 Uhr
Versuch doch mal, auf session_name() zu verzichten und schau nach, ob du überall session_start () verwendet hast.
Bitte warten ..
Mitglied: Mitchell
15.07.2009 um 13:31 Uhr
habe ich schon, ohne benannte Session funktioniert es auch (halbwegs). Ich habe mir mal die ID auf jeder Seite ausgeben lassen und siehe da, er übergibt sie nicht. Daher hab ich an jeden Link ein ".SID." gehangen, natürlich gehts dann. Aber das kann doch nicht die Lösung sein? 1. müsste ich dann auf jeder Seite die SID übergeben und abfragen und 2. kann ich nicht mit dem üblichen arbeiten. Sprich einfach die globalen Sessions abfragen, da diese ja (es sei denn, ich übergebe immer manuell die SID) leer bleiben.

Mfg

Mitchell
Bitte warten ..
Mitglied: Mitchell
30.07.2009 um 12:15 Uhr
Hi Leute,

ich kann es zwar nicht mehr genau nachvollziehen, da ich einfach das Projekt nochmal komplett neu angefangen habe, aber ich bin mir ziemlich sicher, dass der Fehler vor dem Bildschirm war. Ich habe einfach bei der ganzen Testerei mit Cookie, Sessionnamen und beim Löschen der selbigen was durcheinandergeschmissen. Cookie wurde mal gelöscht, obwohl es nie da war (weil ich zu Testzwecken diese im Browser unterbunden habe), Session umbenannt, aber im Logout vergessen, dies umzuschreiben...

Ich danke Allen, die sich meiner angenommen haben

Mfg

Mitchell
Bitte warten ..
Ähnliche Inhalte
CMS
gelöst PhpMyAdmin Login-Seite wird nicht dargestellt (3)

Frage von Static zum Thema CMS ...

Windows 10
Login-Credentials kopieren? (14)

Frage von 1410640014 zum Thema Windows 10 ...

Windows Server
gelöst Login Script (kix) bei Windows Server 2012 R2 (6)

Frage von TechNoob17 zum Thema Windows Server ...

Neue Wissensbeiträge
Tipps & Tricks

Wie Hackt man sich am besten in ein Computernetzwerk ein

(29)

Erfahrungsbericht von Herbrich19 zum Thema Tipps & Tricks ...

Humor (lol)

Bester Vorschlag eines Supporttechnikers ever: APC

(15)

Erfahrungsbericht von DerWoWusste zum Thema Humor (lol) ...

Windows Server

Exchange 2010 Active Directory und Windows Server 2016

(4)

Erfahrungsbericht von Herbrich19 zum Thema Windows Server ...

Heiß diskutierte Inhalte
Internet
gelöst Mitarbeiter surft auf unerwünschter Seite - Wie damit umgehen? (52)

Frage von sabines zum Thema Internet ...

Netzwerke
LAN2LAN Verbindung sehr langsam flaschenhals gesucht (27)

Frage von PixL86 zum Thema Netzwerke ...

Router & Routing
PFsense - Netzverbindung steht, aber kein Internet vorhanden (25)

Frage von aschmid zum Thema Router & Routing ...

Windows Server
gelöst Windows 2016 Hyper-V und VHDS (19)

Frage von emeriks zum Thema Windows Server ...