Zum Inhalt springen

PHP Session()


Empfohlene Beiträge

Hey Leute,

komischer effekt.

Hab mich auf meiner Page eingeloggt.

Wenn ich dann den Browser schließe, ohne mich auszuloggen via session_destroy() etc. kann ich mich nichtmehr einloggen bis ich die logoff.php (mit der session_destroy() Funktion) manuell aufrufe.

An was kann das liegen, bzw. wie kann ich dem entgegenwirken?

Meine Logoff.php

<?php

//session_start();
session_destroy();
session_unset();

header("location:./");

return true;
?>[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich bin zwar nicht ganz ein PHP-Fachmann, aber ohne mehr von deinem Code zu kennen würde ich vermuten, dass irgendwas in deiner Session gesetzt wird, was das Einloggen verhindert. Evtl. Prüfst du etwas ab und diese Prüfung liefert genau das nicht erwartete Ergebnis, weil die etwas in der Session gesetzt ist. Soweit ich weiß, wird eine Session in PHP nicht zerstört, nur weil man das Browserfenster schließt. Sprich vor dem einloggen solltest du die Session wieder aufnehmen falls eine vorhanden ist bzw. eine neue starten und dann VOR dem Einloggen prüfen, ob der benutzer nicht schon eingeloggt ist.

//session_start();

session_destroy();

Soweit mir bekannt ist, solltest du das _start() nicht auskommentieren, da du an dieser Stelle die Session wieder aufnehmen musst, um diese zu erstören.

Aber wie gesagt, mehr von deinem Code sieht man nicht, also kann ich nur vermuten :D

Gruß,

:)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich bin zwar nicht ganz ein PHP-Fachmann, aber ohne mehr von deinem Code zu kennen würde ich vermuten, dass irgendwas in deiner Session gesetzt wird, was das Einloggen verhindert. Evtl. Prüfst du etwas ab und diese Prüfung liefert genau das nicht erwartete Ergebnis, weil die etwas in der Session gesetzt ist. Soweit ich weiß, wird eine Session in PHP nicht zerstört, nur weil man das Browserfenster schließt. Sprich vor dem einloggen solltest du die Session wieder aufnehmen falls eine vorhanden ist bzw. eine neue starten und dann VOR dem Einloggen prüfen, ob der benutzer nicht schon eingeloggt ist.

Soweit mir bekannt ist, solltest du das _start() nicht auskommentieren, da du an dieser Stelle die Session wieder aufnehmen musst, um diese zu erstören.

Aber wie gesagt, mehr von deinem Code sieht man nicht, also kann ich nur vermuten :D

Gruß,

:)

Von der Idee her nicht unbedingt falsch ;) Die Session wird mit session_start wieder aufgenommen wenn schon eine vorhanden war. Beenden mit start -> destroy...

Wenn bei der Session nicht zusätzlich mit Cookies oder dergleichen gearbeitet wird bleibt die Session eine gewisse Zeit lang bestehen. Ich lasse mich da gerne korrigieren aber ich glaube in der php.ini kann man sagen wie lange eine Session dauern soll bis sie erneuert werden muss.

Also wenn du dich einloggst, fenster zu, fenster auf, dann bist du noch eingeloggt ausser du wartest die x sekunden/minuten/whatever die in der php.ini eingestellt sind.

Als Tipp, da du das zu Fuß programmierst denke ich nutzt du kein Framework. Davon kann ich immer nur abraten, egal um was es geht, wie groß oder klein die Seite sein soll, ein Framework was dazu passt gibt es immer. Und wenn die Seite noch klein ist, dann nutz wenigstens SlimFramework, das liefert dir schon alles was du brauchst nur um paar Seiten zu erstellen und kann sogar mit Doctrine als ORM arbeiten. Das macht dir die Arbeit so viel leichter. Und Sessions gibt es da auch, und das nutzen von fertigen Session-Funktionen ist immer viiiiel bequemer und du musst das Rad nicht neu erfinden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also

Logoff Page

<?php

session_start();
session_destroy();
session_unset();

header("location:./");

return true;
?>[/PHP]

Login Function:

[PHP]public static function login($sEMail, $szPassword)
{
include('./settings.cfg');
if(mysql_num_rows("select * from Benutzer_test where EMail='$sEMail' and Passwort='".md5($sPassword)."'") >= 0)
{
$_SESSION['EMail'] = strtolower($sEMail);
return true;
}
else
return false;
}

Wobei, sorry, das Logoff funktioniert ja wunderbar. Nur wenn ich den browser kille und wieder öffne bin ich nichtmehr eingeloggt. Wenn ich mich einloggen will, schreibt er zwar "Erfolgreich eingeloggt" aber das bin ich im endeffekt garnicht.

Um das Problem zu beheben muss ich die Logoff.php einmal manuell aufrufen, dann geht auch das einloggen wieder.

Bearbeitet von tschulian
Link zu diesem Kommentar
Auf anderen Seiten teilen

Also in dem PHP Dokument wo du die statische funktion login(); aufrufst, nicht das Dokument wo die Funktion deklariert ist, benutzt du dort am Anfang session_start() um die Session wieder aufzunehmen?

VOR dem login solltest du prüfen ob $_SESSION['EMail'] noch gesetzt ist, wenn ja ist der Benutzer bereits eingeloggt und du brauchst kein login durchführen.

Gruß

Edit: Klassiker: mysql_ ist verwaltet. Guck dir mal lieber mysqli_ an ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also

Logoff Page

<?php

session_start();
session_destroy();
session_unset();

header("location:./");

return true;
?>[/PHP]

Login Function:

[PHP]public static function login($sEMail, $szPassword)
{
include('./settings.cfg');
if(mysql_num_rows("select * from Benutzer_test where EMail='$sEMail' and Passwort='".md5($sPassword)."'") >= 0)
{
$_SESSION['EMail'] = strtolower($sEMail);
return true;
}
else
return false;
}

Wobei, sorry, das Logoff funktioniert ja wunderbar. Nur wenn ich den browser kille und wieder öffne bin ich nichtmehr eingeloggt. Wenn ich mich einloggen will, schreibt er zwar "Erfolgreich eingeloggt" aber das bin ich im endeffekt garnicht.

Um das Problem zu beheben muss ich die Logoff.php einmal manuell aufrufen, dann geht auch das einloggen wieder.

Abgesehen davon, dass fiae12 recht hat das mysql_* veraltet ist und mysqli die neuere Version ist, solltest du auf jeden Fall aufpassen. Wenn ich das richtig sehe kommt $eMail in die Funktion und wird hart in dein SQL-Statement geschrieben. Ich hoffe du prüfst vor dem Aufruf der Funktion darauf dass der Wert gültig ist. Wenigstens ein htmlspecialchars() sollte darum.

Wenn du das nicht machst kann dir jeden per SL-Injection die gesamte DB auslesen.

Wenn man im Formular einfach nur mal im Email-Feld das hier eingibt:


' UNION ALL (und hier ein anderes Statement);
[/PHP]

kann er dir schön in der DB rum fummeln. Selbst wenn er an dieser Stelle wohl keine Ausgabe erleben wird kann er dir immer noch alles verhauen in dem er dein Statement beendet und alle Daten löscht:

[PHP]
'; TRUNCATE TABLE (hier wird er dann einfach mal paar Tabellen namen nutzen die so ziemlich jeder hat);

Achte auf sowas!

Erneut hier mein Tipp: Nutze Frameworks und ORMs damit du davor schon sicher bist. Die Sicherheit die du dir vllt einbildest weil du paar Mechanismen einbaust um dagegen zu wirken ist nichts im Vergleich zu dem was dir ein Framework (OpenSource) bieten kann da da hunderte Menschen dran arbeiten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das wird eine Website für mein IT-Dienstleistungsnebengewerbe. Und die Sicherheitsfunktionen sind gegeben - wollte nur nicht den ganzen Sourcecode posten.

Ja, session_start(); ist auf der Seite auf der die Login() funktion aufgerufen wird eingebunden.

Session_start() sollte auf so ziemlich jeder Seite aufgerufen werden... Nein nicht so ziemlich, eindeutig auf jeder..

Am sinnvollsten ist da (ich nehme mal an da du es ohne Framework machst) wirst du eine index.php haben die den rest verwaltet? Dann bau da als erstes nach dem <?php das session_start(); ein

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist auf jeder Seite, und sogar der index.php eingebunden...


<?php
//index.php
session_start();
require_once('.pager.php');
include('./settings.cfg');
$core = new core();
global $core;
?>

<!DOCTYPE html>
<html lang="en">
<head>
<title><?php echo $website_title;?></title>

<!-- Meta -->

... und viele Zeilen mehr.

[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

wollte nur nicht den ganzen Sourcecode posten.

Deswegen kann ich nur vermuten, dass bei dir irgendwas in der Session gesetzt ist, was das einloggen blockiert und erst wieder frei macht, wenn du die Session zerstörst.

Also prüf vor dem Einloggen einfach, ob der Benutzer schon eingeloggt ist, denn in der Regel ist das schließen des Browserfensters nicht gleichzusetzen mit dem zerstören einer Session.

Dennoch, wenn du schon dabei bist eine Website für ein IT-Dienstleistungsnebengewerbe zu erstellen, mach dich mit den Themen die Heikooo genannt hat, Frameworks, SQL-Injection, etc. vertraut.

Gruß,

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deswegen kann ich nur vermuten, dass bei dir irgendwas in der Session gesetzt ist, was das einloggen blockiert und erst wieder frei macht, wenn du die Session zerstörst.

Also prüf vor dem Einloggen einfach, ob der Benutzer schon eingeloggt ist, denn in der Regel ist das schließen des Browserfensters nicht gleichzusetzen mit dem zerstören einer Session.

Dennoch, wenn du schon dabei bist eine Website für ein IT-Dienstleistungsnebengewerbe zu erstellen, mach dich mit den Themen die Heikooo genannt hat, Frameworks, SQL-Injection, etc. vertraut.

Gruß,

Also, Problem gelöst. Hab eine Backup-Datei der index.php gehabt, und diese standardmäßig aufgerufen - in der Fehlte das session_start(); noch. Wäre mir glaub ich nie aufgefallen, wenn ich nicht direkt in die index.php geschaut hätte.

Danke.

Wegen meiner Website:

Auf der Website tummeln sich wahrscheinlich nur meine Kunden. Die Tables haben fast alle cryptische Namen, dennoch hab ich natürlich gegen SQL Injection vorgesorgt - hab eine security::class in der generell alle Aufgaben / Variablen checkt - aber ist ja unrelevant.

Ich guck mal mir das von euch trotzdem Mal an - hab in meiner settings.cfg auch eine Variable in der ich SOFORT alle mssql/mysql variablen auf MS oder MY umstellen kann - somit ist die Website auf MSSQL und MYSQL Nutzbar. Das mysqli hab ich nochnie gehört :D Ich muss dazu sagen, dass ich nicht oft nach neuen Dingen google sondern eher an meinen alten, eingefleischten Templates arbeite. Klingt altmodisch, aber ist dennoch effektiver als ihr denkt.

Trotzdem Danke! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, Problem gelöst. Hab eine Backup-Datei der index.php gehabt, und diese standardmäßig aufgerufen - in der Fehlte das session_start(); noch. Wäre mir glaub ich nie aufgefallen, wenn ich nicht direkt in die index.php geschaut hätte.

Danke.

Gerne :D

Wegen meiner Website:

Auf der Website tummeln sich wahrscheinlich nur meine Kunden. Die Tables haben fast alle cryptische Namen, dennoch hab ich natürlich gegen SQL Injection vorgesorgt - hab eine security::class in der generell alle Aufgaben / Variablen checkt - aber ist ja unrelevant.

--> Kunden sind die schlimmsten von allen. Wenn du sie verärgerst und einer hat Ahnung... Naja das kann böse enden..

Hier gilt das gute alte Motto "Vertraue niemandem"...

Hier ganz wichtig!! Tabellen-Namen kryptisch oder nicht, wenn du dir das Schema ausliest siehst du wie die Tabellen heissen und dann ist vorbei ;) Wenn du Stellen hast die Ausgaben erzeugen kann man per Injection auch die Ausgabe nutzen um sich Namen von Tabellen und Spalten usw zu besorgen und dann wenn du noch eine Stelle hast wo man Update oder delete o.Ä. ausführen kann ist deine DB entweder schnell leer oder voll mit müll das du sie selbst leeren musst.

Mach daher wenigstens Backups ;)

Ich guck mal mir das von euch trotzdem Mal an - hab in meiner settings.cfg auch eine Variable in der ich SOFORT alle mssql/mysql variablen auf MS oder MY umstellen kann - somit ist die Website auf MSSQL und MYSQL Nutzbar. Das mysqli hab ich nochnie gehört :D Ich muss dazu sagen, dass ich nicht oft nach neuen Dingen google sondern eher an meinen alten, eingefleischten Templates arbeite. Klingt altmodisch, aber ist dennoch effektiver als ihr denkt.

Ich kenne das Verhalten immer den alten Kram zu nutzen, aber du hast keine Ahnung wie schnell es auf einmal geht und was für einen Komfort diese Frameworks usw. mit sich bringen ;) Slim für kleine, Cakephp für größere und wenn du es ganz heavy haben willst Zend (würde ich abraten, mega overhead, kann aber dafür alles ausser Kaffee kochen und Bügeln).. Sonst für die ganz dicken Sachen vllt noch Symphony...

Desweiteren wie gesagt schau dir ORMs an (Doctrine ist hier gut zum üben). So vieles was du sonst zu Fuß schreiben würdest geht dir in Sekunden aus der Hand.

Zum Thema umstellen von MY- auf MS-Sql. Ich glaube kaum das du den Aufwand betreibst alle Daten in beiden DBs vorzuhalten. Daher denke ich ist ein einfacher Wechsel nicht drin da du sonst Daten in beide DBs füllst die nicht die von der anderen DB kennen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gerne :D

--> Kunden sind die schlimmsten von allen. Wenn du sie verärgerst und einer hat Ahnung... Naja das kann böse enden..

Hier gilt das gute alte Motto "Vertraue niemandem"...

Hier ganz wichtig!! Tabellen-Namen kryptisch oder nicht, wenn du dir das Schema ausliest siehst du wie die Tabellen heissen und dann ist vorbei ;) Wenn du Stellen hast die Ausgaben erzeugen kann man per Injection auch die Ausgabe nutzen um sich Namen von Tabellen und Spalten usw zu besorgen und dann wenn du noch eine Stelle hast wo man Update oder delete o.Ä. ausführen kann ist deine DB entweder schnell leer oder voll mit müll das du sie selbst leeren musst.

Mach daher wenigstens Backups ;)

Ich kenne das Verhalten immer den alten Kram zu nutzen, aber du hast keine Ahnung wie schnell es auf einmal geht und was für einen Komfort diese Frameworks usw. mit sich bringen ;) Slim für kleine, Cakephp für größere und wenn du es ganz heavy haben willst Zend (würde ich abraten, mega overhead, kann aber dafür alles ausser Kaffee kochen und Bügeln).. Sonst für die ganz dicken Sachen vllt noch Symphony...

Desweiteren wie gesagt schau dir ORMs an (Doctrine ist hier gut zum üben). So vieles was du sonst zu Fuß schreiben würdest geht dir in Sekunden aus der Hand.

Zum Thema umstellen von MY- auf MS-Sql. Ich glaube kaum das du den Aufwand betreibst alle Daten in beiden DBs vorzuhalten. Daher denke ich ist ein einfacher Wechsel nicht drin da du sonst Daten in beide DBs füllst die nicht die von der anderen DB kennen.

Ich werd mal drübergucken und dir bzw. euch Feedback geben.

Schönen Abend! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...