Suche
  • »In theory there is no difference between theory and practice. In practice there is.«
  • Herzlich Willkommen auf meinem Blog! Pascal
Suche Menü

P3P Internet Explorer (IE) Header Wahnsinn

Also es gibt Dinge, damit möchte man sich nicht beschäftigen, es holt einen aber immer wieder ein. Eines davon ist das Problem mit dem Internet Explorer(IE) wenn man 3rd party cookies speichern will. Denn da wird der Zusammenhang zwischen P3P und dem Internet Explorer massiv offenbar. Deswegen hatte ich vor einiger Zeit auch einen Artikel über Cookie Mythen zum Launch des IE 8 geschrieben…

Das Problem ist so groß, dass sogar Google und facebook sich weigern, nach den P3P Regeln zu spielen und dafür einen „Bug“ in der IE-Implementierung ausnützen, der dadurch dem Umgang mit dem leidigen Thema vereinfacht.

Aber was ist das und warum kümmert es mich?

P3P ist in der Wikipedia erklärt als:
„Platform for Privacy Preferences Project, kurz P3P, ist eine technische Plattform zum Austausch von Datenschutzinformationen. P3P wurde vom WWW Consortium (W3C) am 16. April 2002 als Standard empfohlen.

P3P soll dem Nutzer im Internet helfen, mittels standardisierter Technik schnell einen Überblick zu erhalten, was mit den personenbezogenen Daten geschieht, die beim Besuch einer Website anfallen. Durch die Standardisierung ist es dabei möglich, auch Datenschutzerklärungen von fremdsprachigen Internetseiten zu interpretieren oder die Angaben automatisiert auszuwerten und zu berücksichtigen.“

Soweit, so positiv. Das Problem ist nur, dass der IE davon ausgeht, dass – wenn keine explizite Aussage ur P3P auf einer Seite vorhanden ist – das böse ist.
(Im Gegensatz zu einer fehlerhaften Implementierung wie facebook und Google, das ist nämlich nicht böse, sondern gut, warum auch immer…)

Ok, aber wann wird man damit konfrontiert?

Pauschal: Immer. Aber ich erzähle mal mein Problem, für dass ich mehrere Monate lang recherchiert, gesucht, gelesen habe. Also nicht durchgehend, aber ich konnte das Problem nicht lösen. Vielleicht hilft ja jemand anderem dieser Artikel und der erspart sich dann ein paar graue Haare.

Ein paar gute Startpunkte:

Privacy in Microsoft Internet Explorer 6
Wikipedie: P3P (en)
W3C (nicht soo hilfreich)
P3p bei Stackoverflow
Christian Bock

Ausgangssituation:

– User U klickt auf eine Adwords-Anzeige von www.example.ORG
– U kommt auf www.example.ORG – Adwords Kampagne wird über Konto Verknüpfung an Analytics übergeben
– U klickt auf Partner-Link zu „www.example.COM“: Click-Out wird bei uns www.example.ORG/clickout.php erfolgreich gemessen
– U landet auf www.example.COM/LandingPage.html
– auf dieser Landing Page wird ein iframe von www.example.ORG/iframe.php geöffnet, um der Erfolg zu tracken

Dieses Analytics-Goal wird in FireFox und Chrome den richtigen Kampagnen zugewiesen, nur in IE nicht.
Der IE scheint die Conversions dem Kanal (direct) zuzuordnen.

Soweit das ursprüngliche Problem.

Erster Lösungs-Ansatz: Ah klar, P3P Problem.
Änderung:
-> die iframe.php schickt einen P3P Header:
P3P CP="CAO PSA OUR"
Dieser Header wird als die einfachste Lösung allgemein empfohlen…

Exkurs: Wie setzt man den P3P Header?

p3p http header in PHP?
header('P3P:CP="CAO PSA OUR"');

p3p http header in ASP.Net?
HttpContext.Current.Response.AddHeader("p3p", "CP=\""CAO PSA OUR\""")

p3p http header in JSP?
response.setHeader("P3P","CP='CAO PSA OUR'")

Zweiter Lösungs-Ansatz:
– Analytics Multi-Domain Tracking?
-> Analytics Code wird (danke Timo Aden) gesetzt auf:
pageTracker._setDomainName(".example.org");

(Ja ich weiss, dass das nicht der asynchrone Weg ist, das hat in dem Fall Legacy Gründe)

Dritter Lösungs-Ansatz
Session TimeOut / Externer Referer des iFrames (www.example.COM) könnte Kampagnen Variablen überschreiben?
-> iframe.php (danke Tim Sebastian) setzt:
pageTracker._setReferrerOverride("www.example.com");

Vierter Lösungs-Ansatz:
Kontrolle aller Header um den iframe Aufruf herum,
siehe da, www.example.COM/LandingPage.html schickte keinen P3P Header,
also das auch mit Hilfe des Partners gefixed, aber…

Jeder dieser Schritte brachte kleine Veränderungen / Verbesserungen, aber das Grundproblem blieb.

Nach einiger Zeit baute ich ein Log-File auf sowohl der Click-out und der iframe.php ein, und alles (natürlich anonymisiert) mitschreiben, was ich bekam, HTTP header, Umgebungsvariablen etc.
Dabei stellte sich dann heraus:

Der Internet Explorer sieht auf der iframe.php in ca 90% nur das __utmc Analytics-Cookie, aber nicht das __utmz Analytics Cookie.
auf der clickout.php sind aber beide Cookies noch da.

Das __utmz Cookie laut der Google Analytics Cookie Doku ist ein persistentes Cookie, das __utmc Cookie ist ein Session Cookie…

Aber interessanterweis war auch ein persistentes Cookie da, das von mir für andere Tracking-Zwecke gesetzt wurde.
Also so sehr es mich freut, dass mein Cookie noch da ist, wenn das Analytics Cookie schon weg ist, war das trotzdem seltsam.

Idee: DNT-Header – nein, den gibt es nur bei FF und Chrome. – dachte ich, wiel Microsoft für den IE eine White/Blacklist Strategie fahren wollte…. Aber laut Wikipedia: DNT supporten sie ihn. Kurze Prüfung ergab. Das ist es nicht, denn die betroffenen Clients senden keinen DNT Header.

Nächste Idee: Javascript gesetztes Cookie vs. PHP gesetztes Cookie (HTTP only)…
unwahrscheinlich, da Analytics das Cookie auch server-seitig beim Pixelaufruf setzt.

Irgendwann las ich die Dokumentationen wieder und wieder durch, bis ich bei einem Satz hängen blieb.
„Internet Explorer 6 takes action on cookies based on the context in which the cookie was sent and on the content of its compact policy.“

Ich war bisher immer davon ausgegangen, dass die Seite im iframe dokumentieren muss, dass sie „brav“ ist.
Jetzt aber kam mir die Vermutung auf, dass es auch auf den Kontext ankommt, wenn der jeweilige Cookie gesetzt wird.
Das würde zumindest auch erklären, warum mein Cookie durchkam, denn ich weiss, dass ich diesen Header inzwischen aus Prinzip mitschicke.

Ein bisschen Recherche und ich fand den Punkt, den ich dann vermutet hatte.
Der Explorer merkt sich zu jedem Cookie den P3P Kontext zu dem Zeitpunkt, wo es gesetzt wurde!

Wenn man drüber nachdenkt, macht das natürlich Sinn, aber der Weg dahin…

Das Problem ist nur, dass Google Analytics seinen Cookie ja auf jeder Seite setzen kann…
Ok, aber wie implementiert man site-wide einen P3P Header?

Hier ist die .htaccess dein Freund:

<ifModule mod_headers.c>
   Header set P3P "CP=\"CAO PSA OUR\""
</ifModule>

Das kann man übrigens auch in der httpd.conf machen oder in den Einstellungen des virtual hosts

<VirtualHost>
Header set P3P 'CP="CAO PSA OUR"'
</VirtualHost>

Es gab einen anderen Weg, den ich noch alternativ versucht hätte, und zwar über „known location“ eine p3p.xml in den pfad /w3c/ zu legen, aber das habe ich nicht ausprobiert…

So, es ist implementiert und das Logfile zeigt viel mehr Cookies als vorher…

Wichtig ist, wenn Ihr das gleiche Problem habt,
auch alle Lösungsansätze oben durchzuprüfen,
denn soweit ich das sehe funktioniert nur die Kombination von allen.

Und dann:
Tief durchatmen…

Autor:

Pascal Fantou, Jahrgang 1972 ist Growth Hacker, Internet Marketer und Dad. Er bloggt seit 2006 auf q48.de

2 Kommentare Schreibe einen Kommentar

  1. Einfach im HTML5 Boilerplate nachschauen ;-)

    # ———————————————————————-
    # Cookie setting from iframes
    # ———————————————————————-

    # Allow cookies to be set from iframes (for IE only)
    # If needed, uncomment and specify a path or regex in the Location directive

    #
    #
    # Header set P3P „policyref=\“/w3c/p3p.xml\“, CP=\“IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\““
    #
    #

    http://html5boilerplate.com/

    Gruss,
    Stefan

  2. @ stefan der Punkt war in dem Fall, dass das Setzen aus dem iframe ja funktionierte. nur das Lesen nicht ;-)

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.


*

// XING Test pxl = document.createElement("img"); pxl.src="https://www.xing.com/profile/Pascal_Fantou?" + Math.random();