PHP Sessions und Browser

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hi

Habe heute festgestellt, wenn man z.B. in Chrome einstellt das absolut keine
Webseitendaten gespeichert werden dürfen, dann funktionieren
Sachen die über "sessions" geregelt werden nicht mehr.
Das wäre z.B. gewählte Sprache, wähle ich z.B. Englisch dann wird beim browsen auf der Seite wieder auf Standard zurückgesetzt.


Ist das normal?
Bei Cookies ist mir das klar aber bei Sessions?
Eben weil man Cookies abschalten kann habe ich alles über sessions gemacht, und jetzt sowas :freak:
 
Hi,

ich zitiere mal diese Seite:

Der Browser behält sich (nur) seine Session-ID in der Regel in einem Cookie. Ein Problem ist, wenn diese Cookies abgeschaltet sind, würde die Session-ID auf jeder Seite verloren gehen, Sessions wären also vollkommen wirkungslos.

Hättest du in 2 Sekunden Googeln selber finden können.

VG,
Mad
 
Nunja, falls du session.use_trans_sid aktiviert hast, sollte der PHP-Interpreter an jeden relativen Link deiner Webseite eine PHPSESSID-Variable anhängen, in welcher sich, wie der Name schon sagt, die Session-ID befindet.

Beispiel:
Code:
http://www.deineseite.de/?page=home

wird zu:
Code:
http://www.deineseite.de/?page=home&PHPSESSID=...

Du kannst session.use_trans_sid per ini_set() aktivieren, falls es nicht aktiviert ist:
Code:
ini_set('session.use_trans_sid',1);

Freundliche Grüsse,
Spartan-117
 
Hi,

wobei ich diese Methode mit der URL-Konkatenierung nicht empfehlen würde. Sicherheitstechnisch meiner Meinung nach nicht sinnvoll. Ausserdem (Horrorszenario): Stell dir vor, die URL wird gebookmarked oder noch schlimmer: weitergegeben... plötzlich hat User B Zugang auf die Sachen von User A. Und keiner weiß warum...

Und das war der Fall, wo User A das freiwillig macht :) ;)

VG,
Mad
 
@Mad..
Zu 1.
Richtig, hätte ich machen können, nur ob das jetzt alles stimmt was man so bei Google findet ist eine andere Sache, du hast ja das gefunden wo es stimmt weil du es ja bereits wusstest. :)
Ich hätte wahrcheinlich weiß Gott was gefunden und wäre dann wohl wahrscheinlich auf dem falschen Dampfer, oder hätte verschiedenen Antworten gefunden und wäre noch da wo ich am Anfang auch war.

Zu 2.
Das dürfte doch garnicht funktinieren, weil die Sessions auf dem Server doch immer erneuert werden oder? also wenn dann könnte sowas nur innerhalb paar Minuten passieren, oder sehe ich das falsch?

@Sparten
Genau, das war bei mir abgeschaltet, nun gehts, danke.
 
Madman1209 schrieb:
Hi,

wobei ich diese Methode mit der URL-Konkatenierung nicht empfehlen würde. Sicherheitstechnisch meiner Meinung nach nicht sinnvoll. Ausserdem (Horrorszenario): Stell dir vor, die URL wird gebookmarked oder noch schlimmer: weitergegeben... plötzlich hat User B Zugang auf die Sachen von User A. Und keiner weiß warum...

Und das war der Fall, wo User A das freiwillig macht :) ;)

VG,
Mad

Naja, die Sicherheitsrisiken müssen Benutzer ohne Cookies eingehen. :)
Ausserdem kannst du auch den Session-Cookie "entwenden" und dich somit auch als User A ausgeben. Jedoch stimme ich dir zu, dass es über URL's sehr viel leichter ist, an die Session-ID zu gelangen. ;)

Aber was sollte man sonst machen, wenn der Browser keine Cookies akzeptiert?

Belee schrieb:
@Mad..
Zu 1.
Richtig, hätte ich machen können, nur ob das jetzt alles stimmt was man so bei Google findet ist eine andere Sache, du hast ja das gefunden wo es stimmt weil du es ja bereits wusstest. :)
Ich hätte wahrcheinlich weiß Gott was gefunden und wäre dann wohl wahrscheinlich auf dem falschen Dampfer, oder hätte verschiedenen Antworten gefunden und wäre noch da wo ich am Anfang auch war.

Zu 2.
Das dürfte doch garnicht funktinieren, weil die Sessions auf dem Server doch immer erneuert werden oder? also wenn dann könnte sowas nur innerhalb paar Minuten passieren, oder sehe ich das falsch?

@Sparten
Genau, das war bei mir abgeschaltet, nun gehts, danke.

Die Sessions werden über die Session-ID wiedererkannt, wie du diese überträgst spielt keine Rolle, ob nun über Cookies oder in der URL.

Freundliche Grüsse,
Spartan-117
 
Zuletzt bearbeitet:
Hi,

ABer was sollte man sonst machen, wenn der Browser keine Cookies akzeptiert?

Klar, natürlich. Das war nicht als Kritik gemeint, deine Lösung ist der einzig gangbare Weg, wenn die Nutzer keine Cookies wollen. Ich meinte das eher so in die Richtung "manche User provozieren's aber auch wirklich" :)

VG,
Mad
 
@Mad:

Habe es auch nicht als Kritik aufgefasst. :)
Jedoch wüsste mir selber keine bessere Alternative einfallen.
Deshalb die Frage, wie man dieses Problem sonst noch(ohne die Sicherheitsrisiken) lösen könnte?
 
Hi,

also soweit ich das bisher gelesen / gemacht habe gibts glaube ich wirklich nix anderes. Leider.

Irgendwie muss es an den Server - und wenn der Nutzer das unterbindet bleibt nur die Möglichkeit per URL.

VG,
Mad
 
Ich würde es dir bei sicherheitsrelevanten Daten in der Session auch raten, die IP des Benutzer abzuspeichern und falls diese mal nicht übereinstimmt (wegen Cookie-Austausch oder der direkten Session-ID-Adhäsion am URL) dann wird die Session einfach gelöscht bzw. regeneriert.

Es gibt keine sichere Lösung. Du solltest die SessID in einem Cookie einbauen und einige sicherheitssignifikante Information dazu mit abspeichern und diese auch anwenden und überprüfen. Jeder der Cookie abschaltet muss mit den Konsequenzen rechnen. Ich würde persönlich auf einer Seite à la "Sie müssen Cookies aktivieren um forzufahren" leiten anstatt die SessID dann direkt im URL weiterzugeben.
Aber brauchst DU wirklich Sessions? Wie der Name schon sagt (Session = de. ~Sitzung) ist es ein einmalige Sache. Die Benutzersprache lege ich im normalen Cookie ab. Falls nicht wird er halt jedesmal auf seine Sprache umstellen müssen. Aufgrund meiner Linkstruktur bleibt die Sprache dann auch ohne Cookies so.
 
Zuletzt bearbeitet:
Man könnte alle Links in Buttons umwandeln und die SID per hidden input verschicken ^^... oder man lässt es. Ich frage mich, ob man wirklich Leuten ohne Cookies alle Funktionen anbieten muss, so böse sind Cookies nun wirklich nicht, dass man sie abschalten muss.

Das dürfte doch garnicht funktinieren, weil die Sessions auf dem Server doch immer erneuert werden oder? also wenn dann könnte sowas nur innerhalb paar Minuten passieren, oder sehe ich das falsch?

@Sparten
Genau, das war bei mir abgeschaltet, nun gehts, danke.
Die Sessions werden über die Session-ID wiedererkannt, wie du diese überträgst spielt keine Rolle, ob nun über Cookies oder in der URL.

So wie ich das verstehe benutzt Belee session_regenerate_id, wenn dann auch noch alle Sessions gelöscht werden tritt genau dieses Problem nicht mehr auf, dann gilt die ID nur für einen einzigen Seitenaufruf und das wars, beim nächsten wird sie wieder neu erzeugt.

Und ich stimme Eagle zu die Sprache kannst du doch auch über eine normale GET-Variable übertragen und es ist zu empfehlen zu der id auch noch die ip und den
PHP:
$_SERVER['HTTP_USER_AGENT']

speichern, außerdem kannst du noch eine Zeitbegrenzung vornehmen wie lange eine Session gültig ist.
 
Um Leute die Cookies deaktiviert haben solltest du dir nicht zu viele Gedanken machen. Die können nämlich ne Vielzahl von Websites nicht mehr richtig nutzen. Daran sind sie aber auch selbst schuld. Einfach kleinen Hinweis auf die Seite und ignorieren.

Sprache würd ich aber nicht über die Session speichern. Nimm da lieber mod_rewrite und häng die Sprache in die URL, also z.B. www.example.com/de/blabla

Session-ID in der URL finde ich generell keine so gute Idee. Das Problem dabei ist v.a. dass GET-Parameter immer in allen Logbüchern geloggt werden - auch bei Proxy-Servern. Außerdem musst du
überall die Links auf der Page anpassen, so dass die SessionID enthalten ist. Das ist manchmal gar nicht so unaufwändig, v.a. wenn Javascript mit im Spiel ist.
 
Zuletzt bearbeitet:
@IceMatrix
Ob mod_rewrite oder nicht, ist sowieso dann auch nur ein $_GET-Parameter.

Was die SessID im URL betrifft ist deine Aussage unvollständig. Wenn die Konfiguration gesetzt ist, wird der Server automatisch an jedem URL die SessID drankleben :) Das auch manchmal das Problem, dass er bei falscher Konfiguration unfreiwillig überall im URL erscheint.
 
Also:
- Session-IDs über GET mitschicken.
- Session-IDs und IPs in einer separaten Datenbank speichern. (sofern diese neu generiert wurden)
- Vor dem session_start(); mit der Datenbank gegenprüfen, ob der Nutzer berechtigt ist.

Grüße
 
Ich brauche die Session auf der Seite allgemein ansonsten müsste ich sehr viel wieder umschreiben. Das ist halt so wenn man am Anfang nicht an alles denkt sondern erst später dies und jenes feststellt.
Ich werde es aber wohl so machen wie @eagle es vorgeschlagen hat. Wer cookies nicht zulässt hat halt Pech und muss mit Konsequenzen rechnen.

Mir ging es hier eigentlich nur darum das User auf de Seite eine Sprache wählen können, die Language Klasse brauch aber Sessions. Ich speichere also die gewählte Sprache "de" oder "en" in einem Cookie und prüfen diesen dann beim erneuten Besuch und setze die Sprache dann via Session. So muss der User dann nicht immer neu die Sprache wählen.
Das Problem hier, die Language Klasse brauch Sessions, ich muss hier also explizit über diese gehen ansonsten müsste ich das ganze komplett umschreiben oder erweitern - mache ich nicht :D
Das ganze läuft über übersetzte "Wörter/Sätze" die dann als z.B. home.dat.en, home.dat.de vorliegen, die dann die Platzhalter auf den Seiten füllen.
 
Eagle-PsyX- schrieb:
Wenn die Konfiguration gesetzt ist, wird der Server automatisch an jedem URL die SessID drankleben :) Das auch manchmal das Problem, dass er bei falscher Konfiguration unfreiwillig überall im URL erscheint.

Da irrst du dich. Das betrifft vielleicht statische Links im HTML/PHP, aber defintiv nicht Links die beispielsweise dynamisch per Javascript bearbeitet werden. Das beschriebene Verfahren ist obsolete und sollte nicht mehr eingesetzt werden.
 
Bin mir noch nicht gaz sicher ob das so gut ist bzw. ob ich noch eine Abfrage bzw. alles ausser "de" und "en" filtern soll bzw. das Cookie ignorieren soll, denn das manipulieren ist ja kein Ding.

PHP:
session_start();  
include_once($_SERVER['DOCUMENT_ROOT'] . '/class.lang.php');
//hier ist die Sprache "Session" bereits als Standard "en" eingestellt!
 
  if(isset($_COOKIE['x_language']) && $_COOKIE['x_language'] == 'de') {
    $_SESSION['language_x'] = 'de';
  }
  else {
    $_SESSION['language_x'] = 'en';
  }
  if(isset($_GET['lang']) && $_GET['lang'] == 'de') {
    setcookie("x_language", "de", time()+60*60*24*7);
  }
  if(isset($_GET['lang']) && $_GET['lang'] == 'en') { 
    setcookie("x_language", "en", time()+60*60*24*7);
  }
 
Zuletzt bearbeitet:
Was tust du in dem Codeausschnitt? Warum setzt du erst ein Cookie und überprüfst dann das Cookie? Dann kannst du doch gleich die Session Variable setzen...
Wenn ich den Code so sehe, müsste doch folgendes passieren:
Link mit &lang=de requested -> dein script speichert das cookie -> jetzt ist die sprache aber nicht gesetzt und dein benutzer sieht keine veränderung.
Erst nachdem er dann noch eine Seite aufgerufen oder aktualisiert hat wird die Session gesetzt..

Wenn du das Cookie nur haben willst um die Sprache "dauerhaft" für den Benutzer zu speichern dann erstell es zusätzlich zur Session, aber so wie du es jetzt hast wirkt sich der Sprachwechsel erst bei noch einem Aufruf aus.

Wenn es aber wirklich nur um die Sprache geht dann ist ein GET Parameter wirklich einfacher. Typo3 zum Beispiel hängt die Sprache mit dem &L= an. Dann müsstest du aber alle Links anpassen.
 
Wo setze ich erst das Cookie? ich dachte es wird erst mal geschaut ob es ein Cookie gibt und ob der Inhalt "de" ist. Wenn ja, Session "de" wenn nein Session "en" wobei "en" standard ist.

Sorry aber, so wie du das beschreibst, genau so funktioniert es eben nicht. Die Sprache ist beim wechsel sofort da und nicht erst wenn man eine andere Seite öffnet.

Und noch was, guckst du:
http://www.php.de/php-tipps-2010/70296-pruefen-ob-cookies-aktiviert-sind.html

Erst setzen, gucken ob geht und dann weiter.
 
Zuletzt bearbeitet:
Zurück
Oben