Wie analysiert PHP rohe Cookies in $ _COOKIE?

9

Ich habe ein Problem mit domainübergreifenden AJAX-Anfragen.

Drei Server sind an diesem Problem beteiligt. Wir können sie A1 , A2 und B nennen.

A1 und A2 führen denselben Anwendungscode aus. Sie sind zwei Staging-Instanzen derselben Webanwendung. B ist eine weitere Webanwendung.

Wir müssen eine domainübergreifende AJAX-Anfrage von der A Webanwendung an die B -Anwendung durchführen. Wir haben mit der Aktivierung von CORS experimentiert, hatten aber Schwierigkeiten, es in IE & lt; = 8 zufriedenstellend zu machen, so dass wir jetzt eine nginx-Proxy-Regel verwenden. Der Ablauf ist daher: Browser Ajax Anfrage - & gt; A1 oder A2 - & gt; nginx proxied - & gt; B

B ist statusbehaftet und erfordert das Session-Cookie des Benutzers, um zu funktionieren.

Was wir sehen, ist, dass dies ordnungsgemäß funktioniert, wenn Sie den Server A1 verwenden. Wenn Sie jedoch den Server A2 verwenden, kann B nicht abgerufen werden aus den Cookies.

Ich habe mir die Header für die Anfragen von A1 und A2 angesehen und sie sind identisch. Beide haben die Cookies Zeile in der Kopfzeile, beide haben den gleichen Ursprung, etc.

Auf B sehen wir, dass $ _COOKIE ['session_key'] leer ist, wenn die Anfrage von A2 kommt, aber ordnungsgemäß ausgefüllt wird, wenn die Anfrage von A1

Das Seltsame ist, dass es nur fehlt, wenn man einen bestimmten Cookie-Schlüssel aus den Cookies in der Kopfzeile zieht, und nur dann, wenn die Anfrage von A2 kommt. Es analysiert jeden anderen Cookie in den Headern von A2 gut, es kann den Session-Cookie des Benutzers aus irgendeinem Grund nicht analysieren, aber es kann gut sein, wenn die Anfrage von A1 kommt .

Ich habe tcpdump benutzt und pcaps von jedem von ihnen genommen und sie diffediert und nichts in den Headern sieht besonders anders aus.

Ich habe diese Stack-Überlauf-Frage gefunden und die Leute sagten, dass es daran lag, dass seine Cookie-Header-Zeichenfolge zu lang war: Was dazu führen könnte, dass Cookie nicht in $ _COOKIE gesetzt wird, wenn es in $ _SERVER ist Ich denke nicht, dass das zu lang ist, wie es meiner ist nur 249 Zeichen lang, sowohl im erfolgreichen als auch im versagenden Fall.

Ich bin an dem Punkt, an dem ich überlege, die Cookies aus $ _SERVER herauszureißen und sie manuell zu analysieren, aber das klingt wirklich dumm und ich würde es vorziehen, das zugrunde liegende Problem herauszufinden.

    
ashgromnies 31.01.2013, 16:03
quelle

4 Antworten

0

PHP war hier nicht schuld.

Wir verwendeten Kohana und es wurde bei der Initialisierung Code ausgeführt, um zu versuchen, dem Sitzungscookie zusätzliche Sicherheit hinzuzufügen. Der betreffende Code hat verifiziert, dass die in der Sitzung auf der Serverseite aufgezeichnete IP-Adresse mit der in den Anforderungsheadern gesendeten IP-Adresse übereinstimmt.

Aufgrund unserer Netzwerkkonfiguration habe ich immer eine externe IP erhalten, wenn ich den Server B kontaktiere, eine interne IP, wenn ich A2 kontaktiere, und eine externe IP, wenn ich A1 kontaktiere.

Als A2 die Anfrage mit der internen IP an B weitergeleitet hat, löste es den IP-basierten Cookie-Schutz von Kohana aus, da der Cookie mit meiner externen IP erstellt wurde, nun aber versucht wird, von meiner internen IP verwendet zu werden.

    
ashgromnies 01.02.2013, 15:44
quelle
0

Ein Problem bei der Verwendung von IE & lt; = 8 ist etwas, das P3P genannt wird. Ich habe festgestellt, dass durch das Einfügen eines P3P-Headers in Seiten, die Ihre AJAX / JSON-Anfrage akzeptieren (Server B in Ihrer Instanz), dieses Problem gelöst wird:

%Vor%

Wie für server A2 , die $_COOKIE Anfragen nicht an server B sendet, würde ich empfehlen, die Anfrage mit _GET an eine Art init Seite am server B zu senden. Auf diese Weise kann es verarbeitet und in server B gespeichert werden. Dann können Sie für alle übrigen Seiten, auf denen diese Informationen vorhanden sein müssen, nach server B suchen, um festzustellen, ob die Informationen gesendet wurden, oder kontinuierlich die _GET -Daten an jede Seite senden und sie mit den bereits vorhandenen Informationen vergleichen. Zur Erinnerung, diese Informationen sollten streng überwacht werden, da es viel einfacher zu ändern ist.

Ich entschuldige mich, ich verstehe, dass dies das Problem nicht löst, aber eine alternative Lösung bieten könnte.

    
Samuel Cook 31.01.2013 16:20
quelle
0

Vor einiger Zeit musste ich Cross-Domain-Ajax-Anfragen machen. Offensichtlich hatte ich das gleiche Problem, als ich versuchte, eine Überschrift zu setzen, um "x-domain ajax" mit IE zu erlauben (erinnere mich nicht genau an den Kopfzeilennamen).

Was ich getan habe, um das zu sortieren, ist die Verwendung von CURL zwischen den Ajaxs des Servers. Auf diese Weise waren meine Ajax-Skripte (in PHP geschrieben) in der Lage, Daten über JSON + CURL über die Server auszutauschen, indem sie einen CURL-POST ausführten und Daten über ein CURL-GET abriefen, unabhängig davon, um welche Domains es sich handelte / p>

Bitte entschuldigen Sie, vielleicht ist das nicht die Antwort, die Sie brauchen, aber, IMO, das könnte jemandem helfen, der nach Cross-Site Ajax sucht.

    
nl2br 20.02.2013 14:45
quelle
0

Verwenden Sie GET zwischen Servern; das ist alles. Und erstellen Sie eine Möglichkeit, das get zu hashen, damit der Benutzer den tatsächlichen Cookie-Inhalt nicht sehen kann, wenn ein Server die Anforderung nicht abschließt.

    
Ekene 06.05.2013 20:29
quelle

Tags und Links