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, 8036 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows 10
Nonstop Login im Sperrbildschirm (4)

Frage von TiCar zum Thema Windows 10 ...

Server
gelöst Amazon-IP, Googlebot und wp-login (12)

Frage von NoWoPr zum Thema Server ...

PHP
PHP MySQL Login (7)

Frage von Yanmai zum Thema PHP ...

HTML
Captive Portal login Seite (2)

Frage von gansa28 zum Thema HTML ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (15)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...