Forum: PC-Programmierung Firefox Cookieproblem: Schlampige Programmierung oder passend zur Spezifikation?


von Johannes O. (jojo_2)


Lesenswert?

Hi,

ich bin zurzeit damit beschäftigt ein größeres Webprojekt umzusetzen. 
Dabei traten bisher aber immer wieder Fehler auf, die nicht wirklich 
reproduzierbar waren und auch in ungleichen Zeitabständen auftraten.

Kurze Vorgeschichte:
Um unsere Besucher wiederzuerkennen und ihre Einstellungen zu speichern 
verwenden wir Cookies. Sobald der Besucher das erste mal die Seite 
aufruft wird das Cookie "visitor" gesetzt das eine zufällige 
Zeichenkette (hexadezimal) als Wert hat, das ganze wird auch in einer 
Datenbank auf dem Server abgelegt.
Das funktionierte soweit alles sehr gut, allerdings wurden an manchen 
Tagen sehr viele Datensätze=neue Cookies generiert, also deutlich mehr 
als man erwartet hätte.
Heute trat dann ein Problem auf: Der Browser eines Bekannten wollte 
keine Cookies dieser Seite mehr annehmen, nur noch nach dem Löschen der 
Chronik (Cache, Cookies etc.) hat es wieder funktioniert. In dieser Zeit 
wurde natürlich immer wieder ein neues Cookie generiert, denn der 
Besucher war ja "neu" (da kein Cookie gefunden wurde).
Wir konnten zwar den Fehler sehen und zeitweise beheben, aber soeben ist 
er dann bei mir wieder aufgetreten: Cookies werden nicht mehr 
akzeptiert.
----------------------

Nun zum "technischen":

(Sub)Domains:
www.asdf.de ist das öffentliche System (natürlich mit ner anderen 
Domain) (1.Server)
login.asdf.de ist ein Bereich für Kunden (1. Server)

dev.asdf.de ist das Entwicklungssystem (2. Server!)
(Das ist das gleiche System, aber mit eigener Datenbank! Befindet sich 
auf einem 2. Server)

Cookies:
visitor mit einem hexadezimalen Wert (einige ZeICHEN)
Pfad: /
Expires: Etwa ein Monat
Domain: .asdf.de   (ja der erste Punkt ist lauf RFC2109 nötig, falls der 
Cookie für ALLE SUBDOMAINS gelten soll. Ist nötig da bei login.asdf.de 
auch das Cookie von www.asdf.de benötigt wird)

Soweit so normal.
Viel herumprobieren hat den Fehler nicht behoben, daher habe ich mir mal 
mit Wireshark den Traffic auf den Servern angesehen.
Was ich da gesehen habe ist sehr merkwürdig:
Wenn ich zuerst auf dev.asdf.de gehe, dann wird der visitor-Cookie 
passend gesetzt. Er wird bei den folgenden Anfragen vom Browser auch 
passend im Header mitgesendet.
Jetzt gehe ich auf www.asdf.de
Der Browser sendet auch den Cookie dort hin (passt!). Natürlich kann der 
Server nichts mit dem Cookie anfangen, da er ihn in SEINER Datenbank 
nicht finden kann. Deshalb generiert er einen neuen und versucht diesen 
zu setzen. Man sieht dass der Cookie an den Browser zurückgesendet wird.
ABER: Nun rufe ich eine weitere Seite auf www.asdf.de auf.
Folgendes wird vom Browser an den Server gesendet:
...
Cookie: visitor=b730a225bfae6e79cef877bbb0f3b847; 
visitor=b6b2d5bc2f6fa0c905423928f8179009
...
Wenn das Script dann mit $_COOKIE['visitor'] den Cookie abfrägt erhält 
es b730a225bfae6e79cef877bbb0f3b847 zurück. Also den ERSTEN Cookie von 
dev.asdf.de.
Der zweite Cookie kommt gar nicht beim Script an, das wäre aber der 
PASSENDE Cookie von www.asdf.de
Was passiert jetzt? www.asdf.de setzt einen neuen Cookie, da er den 
alten ja nicht finden konnte. Aber jetzt wirds richtig verrückt: Haben 
wir jetzt 3 Cookies? NEIN! Der ZWEITE Cookie wird durch den neuen Cookie 
ersetzt. Der ERSTE bleibt erhalten.

Irgendwie krank das ganze...
Der Fehler tritt übrigens nur im Firefox auf, der Internetexplorer macht 
hier alles richtig, dieser lässt immer nur einen Cookie mit diesem Namen 
zu und der alte wird überschrieben.

Scheint also so, als wäre der Cookie an die Subdomain gebunden?? Obwohl 
Domain explizit so gesetzt wurde dass der Cookie zu allen Subdomains 
gehört!

Nun meine Frage dazu: Ist das ein Bug von Firefox oder entspricht das 
irgendeiner RFC? Denn verständlich ist mir dieses Verhalten vom Firefox 
nicht.

Ich hoffe ich konnte das Problem passend erklären dass es verständlich 
ist, sonst bitte nachfragen!

Danke schonmal für die Antworten!

von Jasch (Gast)


Lesenswert?

Johannes O. schrieb:
> Hi,
>
> ich bin zurzeit damit beschäftigt ein größeres Webprojekt umzusetzen.
> Dabei traten bisher aber immer wieder Fehler auf, die nicht wirklich
> reproduzierbar waren und auch in ungleichen Zeitabständen auftraten.
>
> Kurze Vorgeschichte:
> Um unsere Besucher wiederzuerkennen und ihre Einstellungen zu speichern
> verwenden wir Cookies. Sobald der Besucher das erste mal die Seite
> aufruft wird das Cookie "visitor" gesetzt das eine zufällige
> Zeichenkette (hexadezimal) als Wert hat, das ganze wird auch in einer
> Datenbank auf dem Server abgelegt.
> Das funktionierte soweit alles sehr gut, allerdings wurden an manchen
> Tagen sehr viele Datensätze=neue Cookies generiert, also deutlich mehr
> als man erwartet hätte.

Das manche Besucher Cookies brutal unterdrücken ist klar?

> Heute trat dann ein Problem auf: Der Browser eines Bekannten wollte
> keine Cookies dieser Seite mehr annehmen, nur noch nach dem Löschen der
> Chronik (Cache, Cookies etc.) hat es wieder funktioniert. In dieser Zeit

Es gibt eine Obergrenze wieviele Cookies ein User Agent speichern 
kann/will.

> (Sub)Domains:
> www.asdf.de ist das öffentliche System (natürlich mit ner anderen
> Domain) (1.Server)
> login.asdf.de ist ein Bereich für Kunden (1. Server)
>
> dev.asdf.de ist das Entwicklungssystem (2. Server!)
> (Das ist das gleiche System, aber mit eigener Datenbank! Befindet sich
> auf einem 2. Server)
>
> Cookies:
> visitor mit einem hexadezimalen Wert (einige ZeICHEN)
> Pfad: /
> Expires: Etwa ein Monat
> Domain: .asdf.de   (ja der erste Punkt ist lauf RFC2109 nötig, falls der
> Cookie für ALLE SUBDOMAINS gelten soll. Ist nötig da bei login.asdf.de
> auch das Cookie von www.asdf.de benötigt wird)

Sowas ist prinzipiell böse...

> Soweit so normal.

Aua ;-)

> Wenn ich zuerst auf dev.asdf.de gehe, dann wird der visitor-Cookie
> passend gesetzt. Er wird bei den folgenden Anfragen vom Browser auch
> passend im Header mitgesendet.
> Jetzt gehe ich auf www.asdf.de
> Der Browser sendet auch den Cookie dort hin (passt!). Natürlich kann der
> Server nichts mit dem Cookie anfangen, da er ihn in SEINER Datenbank
> nicht finden kann. Deshalb generiert er einen neuen und versucht diesen
> zu setzen. Man sieht dass der Cookie an den Browser zurückgesendet wird.
> ABER: Nun rufe ich eine weitere Seite auf www.asdf.de auf.
> Folgendes wird vom Browser an den Server gesendet:
> ...
> Cookie: visitor=b730a225bfae6e79cef877bbb0f3b847;
> visitor=b6b2d5bc2f6fa0c905423928f8179009

Lies mal RFC 6265 (hier 4.1.2, ist zu allem Überfluss nicht-normativ).

Was Du da versuchst zu tun ist nicht ordentlich standardisiert, wenn das 
funktioniert ist das eher Glück.

Laut RFC sind Deine zwei "visitor"-Cookies verschiedene Cookies, da Du 
aber als Domain bei einem davon einen Wildcard definiert hast - passiert 
halt Mist wenn die Server-Software buggy ist.

> Wenn das Script dann mit $_COOKIE['visitor'] den Cookie abfrägt erhält
> es b730a225bfae6e79cef877bbb0f3b847 zurück. Also den ERSTEN Cookie von
> dev.asdf.de.
> Der zweite Cookie kommt gar nicht beim Script an, das wäre aber der
> PASSENDE Cookie von www.asdf.de

Hmm, hmm, sieht aus wie eine mögliche Interpretation von RFC 6265 
4.1.2.3, d.h. meiner Meinung nach kann der Browser das so machen.

Dann wäre einfach das Script kaputt.

Laut RFC 6265 4.2.2 ist das Script kaputt. Wenn die Programmiersprache 
mit "multi-valued" Cookies nicht klarkommt ist halt die kaputt (ist das 
PHP?)...

> Was passiert jetzt? www.asdf.de setzt einen neuen Cookie, da er den
> alten ja nicht finden konnte. Aber jetzt wirds richtig verrückt: Haben
> wir jetzt 3 Cookies? NEIN! Der ZWEITE Cookie wird durch den neuen Cookie
> ersetzt. Der ERSTE bleibt erhalten.
<
> Irgendwie krank das ganze...

Wie gesagt, RFC 6265 lesen - soweit ich das überblicke ist das ganz 
genau was passieren soll.

Merke: ein Cookie ist definiert durch "cookie-name, domain-value, and 
path-value". Zwei Cookies mit domain-value ".foo.de" und "bar.foo.de" 
sind verschieden und werden beide an "bar.foo.de" gesendet!

Keine Wildcards benutzen macht die Sache viel einfacher.

> Der Fehler tritt übrigens nur im Firefox auf, der Internetexplorer macht
> hier alles richtig, dieser lässt immer nur einen Cookie mit diesem Namen
> zu und der alte wird überschrieben.

Naja, IE halt.

von Johannes O. (jojo_2)


Lesenswert?

Jasch schrieb:
> Das manche Besucher Cookies brutal unterdrücken ist klar?

Ja ist soweit bekannt. Ist aber defintiv nicht die Ursache des Problems.

Jasch schrieb:
> Es gibt eine Obergrenze wieviele Cookies ein User Agent speichern
> kann/will.

Kann auch nicht das Problem sein, gibt nur 1 Cookie mit ein paar 
Zeichen.

Jasch schrieb:
> Sowas ist prinzipiell böse...

Weshalb? Was ist daran schlecht? Wie gesagt: Die Domain (inkl. 
Subdomain) gehören uns, da hat kein anderer Zugriff drauf, 
sicherheitstechnisch also unbedenklich. Und dazu haben die Cookiedaten 
selbst keine wertvollen/geheime Informationen.

Jasch schrieb:
> Lies mal RFC 6265 (hier 4.1.2, ist zu allem Überfluss nicht-normativ).
>
> Was Du da versuchst zu tun ist nicht ordentlich standardisiert, wenn das
> funktioniert ist das eher Glück.
>
> Laut RFC sind Deine zwei "visitor"-Cookies verschiedene Cookies, da Du
> aber als Domain bei einem davon einen Wildcard definiert hast - passiert
> halt Mist wenn die Server-Software buggy ist.

RFC sagt:
>   If the user agent receives a new cookie with the same cookie-name,
>   domain-value, and path-value as a cookie that it has already stored,
>   the existing cookie is evicted and replaced with the new cookie.

=> Die beiden Cookies sind die gleichen. Sie haben den gleichen Namen 
"visitor", die gleichen Pfad "/" und die gleiche Domain .asdf.de
Grundsätzlich funktioniert es aber, dass man, indem man den Cookie 
einfach neu setzt, der auch beim Browser aktualisiert wird.
Liegt auch nicht direkt an der Server-Software, sondern am Browser. Der 
Server sendet ja nur was das Script ihm befiehlt.

Jasch schrieb:
> Laut RFC 6265 4.2.2 ist das Script kaputt. Wenn die Programmiersprache
> mit "multi-valued" Cookies nicht klarkommt ist halt die kaputt (ist das
> PHP?)...

Stimmt... In 4.2.2 ist das recht eindeutig beschrieben dass diese 
Cookies erlaubt sind. Wobei das Problem nicht bei meinem Skript liegt, 
sondern einfach bei PHP, da es im $_COOKIE Array nur immer ein Cookie 
pro Namen zulässt.

Jasch schrieb:
> Wie gesagt, RFC 6265 lesen - soweit ich das überblicke ist das ganz
> genau was passieren soll.
>
> Merke: ein Cookie ist definiert durch "cookie-name, domain-value, and
> path-value". Zwei Cookies mit domain-value ".foo.de" und "bar.foo.de"
> sind verschieden und werden beide an "bar.foo.de" gesendet!
>
> Keine Wildcards benutzen macht die Sache viel einfacher.

Habs oben schonmal geschrieben, aber genau das ist ja mein Problem: Die 
beiden Cookies sind wirklich exakt gleich. Darum ist es merkwürdig warum 
da ein Unterschied gemacht wird.
Möglichkeit A wäre: Pro ankommenden set_cookie wird ein Cookie gesetzt. 
Also erhöht sich die Cookieanzahl immer um 1 pro set_cookie Befehl
Möglichkeit B wäre: Der neue Cookie ersetzt den alten Cookie. Das ist 
die interpretation des Internetexplorers.

Der Firefox interpretiert das aber so: Möglichkeit B, solange sich alles 
in einer Subdomain abspielt + Möglichkeit A für jede Subdomain.
Also der speichert sozusagen auch noch mit woher das Cookie kam...


Danke für deine Antworten! mit den RFCs bin ich schon weitergekommen, 
ich habe es jetzt einfach so gelöst, dass ich das Problem vermeide indem 
die Cookies auf dem Entwickelungsserver einfach einen anderen Namen 
bekommen.

von Jasch (Gast)


Lesenswert?

Johannes O. schrieb:
> Jasch schrieb:
[snip]
> Jasch schrieb:
>> Sowas ist prinzipiell böse...
>
> Weshalb? Was ist daran schlecht? Wie gesagt: Die Domain (inkl.
> Subdomain) gehören uns, da hat kein anderer Zugriff drauf,
> sicherheitstechnisch also unbedenklich. Und dazu haben die Cookiedaten
> selbst keine wertvollen/geheime Informationen.

Du hast doch die Probleme beschrieben die Du damit hast... ;-)

Konservativ sein zahlt sich meistens aus. Gibt sogar eine Internet-Regel 
dazu: "Be conservative in what you send; be liberal in what you accept", 
sprich Postels Law.

Aus Sicherheitsgründen ist jeder Austausch von Daten zwischen 
verschiedenen Servern über vom Angreifer manipulierbare Wege (in diesem 
Fall: Cookies, übrigens auch DNS - aber das ist ja überall irgendwie 
beteiligt) keine gute Idee. Bloss weil uns jetzt gerade kein 
Angriffsszenario einfällt heisst nicht das die Angreifer nicht schlauer 
sind als wir.

Dass da bloss irgendeine ID drinsteht ist keine Ausrede, irgendjemand 
wird einen Weg finden auch damit Unfug anzustellen. Ist noch nicht so 
lange her dass SQL Injection kein Begriff war...

Wenn Du Dinge zwischen den verschiedenen Servern "bereden" willst nimmst 
Du dafür besser ein internes Netz zwischen denen.

> Jasch schrieb:
[snip]
> RFC sagt:
>>   If the user agent receives a new cookie with the same cookie-name,
>>   domain-value, and path-value as a cookie that it has already stored,
>>   the existing cookie is evicted and replaced with the new cookie.
>
> => Die beiden Cookies sind die gleichen. Sie haben den gleichen Namen
> "visitor", die gleichen Pfad "/" und die gleiche Domain .asdf.de

Ooh, ich hatte das so verstanden dass Du einmal dev.asdf.de und dann 
.asdf.de hast.

[snip]
>> Merke: ein Cookie ist definiert durch "cookie-name, domain-value, and
>> path-value". Zwei Cookies mit domain-value ".foo.de" und "bar.foo.de"
>> sind verschieden und werden beide an "bar.foo.de" gesendet!
>>
>> Keine Wildcards benutzen macht die Sache viel einfacher.
>
> Habs oben schonmal geschrieben, aber genau das ist ja mein Problem: Die
> beiden Cookies sind wirklich exakt gleich. Darum ist es merkwürdig warum
> da ein Unterschied gemacht wird.

Hmm, sieht aus als ob Firefox da ein Problem hat. Wenn die Domains, der 
Pfad und der Name genau gleich sind und die RFC keine Sonderbehandlung 
für Wildcards definiert (hab ich jetzt nicht nachgelesen) müsste der 
Cookie eigentlich ersetzt werden.

von Johannes O. (jojo_2)


Lesenswert?

Danke auch nochmal für deine Antwort!
Werd mich mal umsehen nach nem Art "Firefox Supportforum" und dort 
nachfragen ob es sich um einen Bug handelt. Einen Bug zu melden 
erscheint mir gerade noch zu früh.

Nochmal zur Wildcard bzw. Datenaustausch zwischen Subdomains: Es soll 
nur zwischen www.asdf.de und login.asdf.de der Cookie übertragen werden 
bzw. bestehen bleiben. Das ist der gleiche Server und sogar der gleiche 
Ordner darauf, das Script erkennt die Subdomain und gibt den passenden 
Content aus. Könnte man natürlich auch mit Unterordern machen wie z.B. 
www.asdf.de/ und www.asdf.de/login/, ist aber von den URLs her nicht so 
schön (sag nicht ich sondern andere Leute im Team)
Daher sollte sich da kein Problem ergeben.
Die Benutzer werden auch nie dev.asdf.de zu Gesicht bekommen, das ist 
ein Passwortgeschützter Entwicklerbereich. Das ist dann wirklich ein 
anderer Server!

von Troll (Gast)


Lesenswert?

Johannes O. schrieb:
> Werd mich mal umsehen nach nem Art "Firefox Supportforum"

Da gibts z.B. die Mailing-Listen:
* https://lists.mozilla.org/listinfo/support-firefox <- Hilfe
* https://lists.mozilla.org/listinfo/dev-apps-firefox <-Entwickler

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.