Ich habe zwei Websites, sagen wir, sie sind example.com
und anotherexample.net
. Am habe anotherexample.net/page.html
ich eine IFRAME SRC="http://example.com/someform.asp"
. Dieser IFRAME zeigt ein Formular an, das der Benutzer ausfüllen und senden kann http://example.com/process.asp
. Wenn ich das Formular (" someform.asp
") in einem eigenen Browserfenster öffne , funktioniert alles einwandfrei. Allerdings , wenn ich laden someform.asp
als iFrame in IE 6 oder IE 7, die Cookies für example.com werden nicht gespeichert. In Firefox tritt dieses Problem nicht auf.
Zu Testzwecken habe ich ein ähnliches Setup unter http://newmoon.wz.cz/test/page.php erstellt .
example.com
verwendet Cookie-basierte Sitzungen (und ich kann nichts dagegen tun), wird also ohne Cookies process.asp
nicht ausgeführt. Wie zwinge ich den IE, diese Cookies zu speichern?
Ergebnisse des Abhörens des HTTP-Verkehrs: In der Antwort GET /someform.asp gibt es einen gültigen Set-Cookie-Header pro Sitzung (z. B. Set-Cookie: ASPKSJIUIUGF=JKHJUHVGFYTTYFY
), aber in der POST / process.asp-Anforderung gibt es überhaupt keinen Cookie-Header.
Edit3: Einige serverseitige AJAX + -Skripte können das Problem anscheinend umgehen, aber das sieht sehr nach einem Fehler aus und eröffnet eine ganze Reihe neuer Sicherheitslücken . Ich möchte nicht, dass meine Anwendungen eine Kombination aus Fehler und Sicherheitslücke verwenden, nur weil es einfach ist.
Bearbeiten: Die P3P-Richtlinie war die Hauptursache , vollständige Erklärung unten.
quelle
Antworten:
Ich habe es zum Laufen gebracht, aber die Lösung ist etwas komplex.
Was ist los
Internet Explorer verleiht IFRAME-Seiten ein geringeres Maß an Vertrauen (IE nennt dies "Inhalte von Drittanbietern"). Wenn die Seite im IFRAME keine Datenschutzrichtlinie enthält, werden ihre Cookies blockiert (was durch das Augensymbol in der Statusleiste angezeigt wird, wenn Sie darauf klicken, wird eine Liste blockierter URLs angezeigt).
(Quelle: piskvor.org )
In diesem Fall wird beim Blockieren von Cookies keine Sitzungskennung gesendet, und das Zielskript gibt den Fehler "Sitzung nicht gefunden" aus.
(Ich habe versucht, die Sitzungskennung in das Formular zu setzen und sie aus POST-Variablen zu laden. Dies hätte funktioniert , aber aus politischen Gründen konnte ich das nicht tun.)
Es ist möglich, die Seite im IFRAME vertrauenswürdiger zu machen: Wenn die innere Seite einen P3P-Header mit einer Datenschutzrichtlinie sendet , die für den Internet Explorer akzeptabel ist, werden die Cookies akzeptiert .
Wie man es löst
Erstellen Sie eine p3p-Richtlinie
Ein guter Ausgangspunkt ist das W3C-Tutorial . Ich habe es durchgesehen, den IBM Datenschutzrichtlinien-Editor heruntergeladen und dort eine Darstellung der Datenschutzrichtlinie erstellt und ihr einen Namen gegeben, auf den sie verweisen kann (hier war es
policy1
).HINWEIS : An diesem Punkt müssen Sie tatsächlich herausfinden, ob Ihre Website über eine Datenschutzrichtlinie verfügt, und wenn nicht, erstellen Sie diese - ob sie Benutzerdaten sammelt, welche Art von Daten, was sie damit macht, wer Zugriff darauf hat, usw. Sie müssen diese Informationen finden und darüber nachdenken . Nur ein paar Tags zusammenzuschlagen, wird es nicht schneiden. Dieser Schritt kann nicht nur in Software ausgeführt werden und ist möglicherweise sehr politisch (z. B. "Sollen wir unsere Klickstatistiken verkaufen?").
(zB "die Site wird von ACME Ltd. betrieben, sie verwendet anonyme Sitzungskennungen für ihren Betrieb, sammelt Benutzerdaten nur, wenn dies ausdrücklich gestattet ist, und nur für die folgenden Zwecke werden die Daten nur so lange wie nötig gespeichert, nur unser Unternehmen hat Zugriff darauf usw. usw. ").
(Beim Bearbeiten mit diesem Tool können Fehler / Auslassungen in der Richtlinie angezeigt werden. Sehr nützlich ist auch die Registerkarte "HTML-Richtlinie": Unten befindet sich eine "Richtlinienbewertung" - eine schnelle Überprüfung, ob die Richtlinie blockiert wird nach den Standardeinstellungen des IE)
Der Editor exportiert in eine .p3p-Datei, die eine XML-Darstellung der obigen Richtlinie ist. Es kann auch eine "kompakte Version" dieser Richtlinie exportieren.
Link zur Richtlinie
Dann wurde eine Richtlinienreferenzdatei (
http://example.com/w3c/p3p.xml
) benötigt (ein Index der von der Site verwendeten Datenschutzrichtlinien):Das
<INCLUDE>
zeigt alle URIs an, die diese Richtlinie verwenden (in meinem Fall die gesamte Site). Die Richtliniendatei, die ich aus dem Editor exportiert habe, wurde in hochgeladenhttp://example.com/w3c/example-com.p3p
Senden Sie den kompakten Header mit Antworten
Ich habe den Webserver auf example.com so eingestellt, dass er den kompakten Header mit folgenden Antworten sendet:
policyref
ist eine relative URI zur Richtlinienreferenzdatei (die wiederum auf die Datenschutzrichtlinien verweist),CP
ist die kompakte Richtliniendarstellung. Beachten Sie, dass die Kombination der P3P-Header im Beispiel möglicherweise nicht auf Ihrer spezifischen Website anwendbar ist. Ihre P3P-Header MÜSSEN Ihre eigenen Datenschutzbestimmungen wahrheitsgemäß wiedergeben!Profitieren!
In dieser Konfiguration wird der böse Blick nicht angezeigt, die Cookies werden sogar im IFRAME gespeichert und die Anwendung funktioniert.
Bearbeiten: Was NICHT zu tun ist, es sei denn, Sie verteidigen gerne gegen Klagen
Einige Leute haben vorgeschlagen, "nur ein paar Tags in Ihren P3P-Header zu stecken, bis der böse Blick aufgibt".
Die Tags sind nicht nur ein Haufen Bits, sie haben auch reale Bedeutungen und ihre Verwendung gibt Ihnen reale Verantwortlichkeiten !
Wenn Sie beispielsweise so tun, als würden Sie niemals Benutzerdaten erfassen, wird der Browser möglicherweise glücklich. Wenn Sie jedoch tatsächlich Benutzerdaten erfassen, widerspricht der P3P der Realität. Schlicht und einfach, Sie belügen Ihre Benutzer absichtlich , und das kann in einigen Ländern kriminelles Verhalten sein. Wie in "Geh ins Gefängnis, sammle keine 200 Dollar".
Einige Beispiele ( siehe p3pwriter für den vollständigen Satz von Tags ):
STP
also eine Aufbewahrungsrichtlinie senden, aber keine haben , begehen Sie möglicherweise Betrug. Wie cool ist das? Überhaupt nicht.)Ich bin kein Anwalt, aber ich bin nicht bereit, vor Gericht zu gehen, um zu prüfen, ob der P3P-Header wirklich rechtsverbindlich ist oder ob Sie Ihren Benutzern etwas versprechen können, ohne tatsächlich bereit zu sein, Ihre Versprechen einzuhalten.
quelle
Ich habe einen großen Teil meines Tages damit verbracht, mich mit dieser P3P-Sache zu beschäftigen, und ich habe das Bedürfnis, zu teilen, was ich herausgefunden habe.
Ich habe festgestellt, dass das P3P-Konzept sehr veraltet ist und nur von Internet Explorer (IE) wirklich verwendet / durchgesetzt zu werden scheint.
Die einfachste Erklärung lautet: IE möchte, dass Sie einen P3P-Header definieren, wenn Sie Cookies verwenden.
Dies ist eine gute Idee, und zum Glück verursacht das Nicht-Bereitstellen dieses Headers die meiste Zeit keine Probleme (siehe Browser-Warnungen). Es sei denn, Ihre Website / Webanwendung wird mithilfe eines (i) Frames auf eine andere Website geladen. Dies ist, wo IE ein massiver Schmerz in der *** wird. Sie können kein Cookie setzen, es sei denn, der P3P-Header ist gesetzt.
Da ich das wusste, wollte ich eine Antwort auf die folgenden zwei Fragen finden:
Meine Ergebnisse sind:
Das Konzept wurde 2002 geboren und es verwirrt mich, dass dieses veraltete und rechtlich nicht umgesetzte Konzept Entwicklern im IE immer noch aufgezwungen wird. Wenn dieser Header keine rechtlichen Auswirkungen hat, sollte dieser Header ignoriert werden (oder alternativ eine Warnung oder Benachrichtigung in der Konsole generieren). Nicht durchgesetzt! Ich bin jetzt gezwungen, eine Zeile in meinen Code einzufügen (und einen Header an den Client zu senden), die absolut nichts bewirkt.
Kurz gesagt - um den IE bei Laune zu halten - fügen Sie Ihrem PHP-Code die folgende Zeile hinzu (andere Sprachen sollten ähnlich aussehen)
Problem gelöst, und IE ist mit dieser Kartoffel zufrieden.
quelle
Potato
mein P3P das Problem gelöst. Haha!Ich konnte den bösen Blick verschwinden lassen, indem ich einfach diesen kleinen Header zur Site im IFrame (PHP-Lösung) hinzufügte:
Denken Sie daran, Strg + F5 zu drücken , um Ihre Site neu zu laden. Andernfalls zeigt der Explorer möglicherweise immer noch den bösen Blick, obwohl er einwandfrei funktioniert. Dies ist wahrscheinlich der Hauptgrund, warum ich so viele Probleme hatte, es zum Laufen zu bringen.
Es war überhaupt keine Richtliniendatei erforderlich.
Bearbeiten: Ich habe einen schönen Blogeintrag gefunden, der das Problem mit Cookies in IFrames erklärt. Es gibt auch eine schnelle Lösung im C # -Code: Frames, ASPX-Seiten und abgelehnte Cookies
quelle
CP="This_is_not_a_privacy_policy"
. Das zu tun scheint weniger rechtlich bindend, denke ich (da zB NOI und STP und so etwas überhaupt nicht erwähnt wird) und macht IE anscheinend glücklich :-)Dies ist in den Kommentaren anderer Antworten vergraben, aber ich habe es fast verpasst, so dass es scheint, als hätte es eine eigene Antwort verdient.
Zur Überprüfung: Damit der IE Cookies von Drittanbietern akzeptieren kann, müssen Sie Ihre Dateien mit einem http-Header namens p3p im folgenden Format bereitstellen:
ABER p3p ist zu diesem Zeitpunkt als Standard so gut wie tot, und Sie können den Internet Explorer problemlos zum Laufen bringen, ohne Zeit und rechtliche Ressourcen in die Erstellung einer echten p3p-Richtlinie zu investieren. Dies liegt daran, dass wenn Ihr kompakter p3p-Richtlinienheader ungültig ist, der IE ihn tatsächlich als gute Richtlinie behandelt und Cookies von Drittanbietern akzeptiert. Sie können also einen solchen p3p-Header verwenden
Sie können optional einen Link zu einer Seite einfügen, auf der erläutert wird, warum Sie keine p3p-Richtlinie haben, wie dies bei Google und Facebook der Fall ist (sie verweisen hier: https://support.google.com/accounts/answer/151657 und hier: https : //www.facebook.com/help/327993273962160/ ).
Schließlich ist es wichtig zu beachten, dass alle Dateien, die von der Site eines Drittanbieters bereitgestellt werden, den p3p-Header haben müssen, nicht nur den, der das Cookie setzt, sodass Sie dies möglicherweise nicht einfach in Ihrem PHP, asp.net usw. Tun können Code. Sie sind wahrscheinlich besser dran, sich auf Webserverebene einzurichten (dh in IIS oder Apache).
quelle
Ich hatte auch dieses Problem und dachte, ich würde den Code veröffentlichen, den ich in meinem MVC2-Projekt verwendet habe. Seien Sie vorsichtig, wenn Sie im Seitenlebenszyklus, den Sie in den Header einfügen, eine HttpException erhalten. " Server kann Header nicht anhängen, nachdem HTTP-Header gesendet wurden ." Ich habe ein benutzerdefiniertes ActionFilterAttribute für die OnActionExecuting-Methode verwendet (aufgerufen, bevor die Aktion ausgeführt wird).
Anwendungsbeispiel:
quelle
Dies ist ein großartiges Thema zu diesem Thema, aber ich fand, dass ein wichtiges Detail (das zumindest in meinem Fall wesentlich war), das weder hier noch anderswo veröffentlicht wurde (ich entschuldige mich, wenn ich es gerade verpasst habe), dass die P3P-Leitung sein muss Wird im Header JEDER vom Server eines Drittanbieters gesendeten Datei übergeben, auch von Dateien, die keine Cookies setzen oder verwenden, wie z. B. Javascript-Dateien oder Bilder. Andernfalls werden die Cookies blockiert. Ich habe mehr dazu in einem Beitrag hier: http://posheika.net/?p=110
quelle
Jeder, der dieses Problem in node.js hat.
Fügen Sie dann dieses p3p-Modul hinzu und aktivieren Sie dieses Modul in der Middleware.
Ich benutze Express, also füge ich es in app.js hinzu
Benötigen Sie zuerst dieses Modul in app.js.
Verwenden Sie es dann als Middleware
Es werden p3p-Header am res-Objekt hinzugefügt. Keine Notwendigkeit, zusätzliche Dinge zu tun.
Weitere Informationen erhalten Sie unter:
https://github.com/troygoode/node-p3p
quelle
Wenn jemand nach einer Apache-Leitung sucht; wir haben diesen benutzt.
Es war wirklich egal, auf welchen CP-Wert wir eingestellt waren, solange es den P3P-Header gibt.
quelle
Eine Möglichkeit besteht darin, die Domain zu zulässigen Websites in Tools -> Internetoptionen -> Datenschutz -> Websites hinzuzufügen: somedomain.com -> Zulassen -> OK.
quelle
Dieser Beitrag enthält einige Kommentare zu P3P und eine Abkürzungslösung, die die Probleme mit IE7 und IE8 reduziert.
quelle
Eine Lösung, die ich hier nicht erwähnt habe, ist die Verwendung von Sitzungsspeicher anstelle von Cookies. Natürlich entspricht dies möglicherweise nicht allen Anforderungen, aber in einigen Fällen ist es eine einfache Lösung.
quelle
Ich habe dieses Problem im Hinblick auf die Abmeldung über Azure Access Control Services untersucht und konnte keine Verbindung zwischen Kopf und Schwanz herstellen.
Dann stolperte über diesen Beitrag https://blogs.msdn.microsoft.com/ieinternals/2011/03/10/beware-cookie-sharing-in-cross-zone-scenarios/
Kurz gesagt, der IE teilt Cookies nicht über Zonen hinweg (z. B. Internet oder vertrauenswürdige Websites).
Wenn sich Ihr IFrame-Ziel und Ihre HTML-Seite in P3P einer anderen Zone befinden, hilft dies bei nichts.
quelle
Habe ein ähnliches Problem, habe auch heute Morgen untersucht, wie die P3P-Richtlinie generiert wird. Hier ist mein Beitrag darüber, wie Sie Ihre eigene Richtlinie generieren und auf der Website verwenden können :) http://everydayopenslikeaflower.blogspot.com/2009/08/ How-to-Create-p3p-Richtlinie-und-implementieren.html
quelle
Ich habe bereits eine vollständige P3P-Richtlinie implementiert, wollte mich aber bei einem neuen Projekt, an dem ich arbeitete, nicht noch einmal anstrengen. Ich fand diesen Link nützlich für eine einfache Lösung des Problems, da ich nur eine minimale kompakte P3P-Richtlinie von "CAO PSA OUR" angeben musste:
http://blog.sweetxml.org/2007/10/minimal-p3p-compact-policy-suggestion.html
Der Artikel zitiert einen (jetzt defekten) Link zu einem Microsoft KB-Artikel. Die Politik hat den Trick für mich getan!
quelle
Sie können auch die Dateien p3p.xml und policy.xml als solche kombinieren:
/home/ubuntu/sites/shared/w3c/p3p.xml
Ich fand, dass der einfachste Weg, einen Header hinzuzufügen, ein Proxy über Apache ist und mod_headers als solchen verwendet:
Daher stellen wir alle Anforderungen außer denen an /w3c/p3p.xml an unseren Anwendungsserver.
Sie können alles mit dem W3C-Validator testen
quelle
Wenn Sie die Domain besitzen, die eingebettet werden muss , können Sie vor dem Aufrufen der Seite, die den IFrame enthält, zu dieser Domain umleiten, wodurch das Cookie erstellt und zurückgeleitet wird, wie hier erläutert: http: //www.mendoweb. be / blog / internet-explorer-safari-Drittanbieter-Cookie-Problem /
Dies funktioniert für Internet Explorer, aber auch für Safari (da Safari auch Cookies von Drittanbietern blockiert).
quelle
Ich weiß, dass es etwas spät ist, meinen Beitrag zu diesem Thema zu leisten, aber ich habe so viele Stunden verloren, dass diese Antwort vielleicht jemandem hilft.
Ich habe versucht, ein Cookie eines Drittanbieters auf meiner Website aufzurufen, und natürlich funktionierte es in Internet Explorer 10 nicht, selbst bei niedriger Sicherheitsstufe. Fragen Sie mich nicht, warum. Im iframe habe ich eine read_cookie.php (echo $ _COOKIE) mit Ajax aufgerufen.
Und ich weiß nicht, warum ich die P3P-Richtlinie zur Lösung des Problems nicht festlegen konnte ...
Während meiner Suche habe ich etwas darüber gesehen, wie der Cookie in JSON funktioniert. Ich versuche es nicht einmal, weil ich dachte, wenn der Cookie keinen Iframe durchläuft, durchläuft er kein Array mehr ...
Ratet mal, was es tut! Wenn Sie also Ihren Cookie mit json_encode codieren und nach Ihrer Ajax-Anfrage dekodieren, erhalten Sie ihn!
Vielleicht habe ich etwas verpasst und wenn ich es getan habe, alle meine Entschuldigungen, aber ich habe noch nie etwas so Dummes gesehen. Blockieren Sie Cookies von Drittanbietern aus Sicherheitsgründen. Lassen Sie sie jedoch passieren, wenn sie verschlüsselt sind. Wo ist die Sicherheit jetzt?
Ich hoffe, dieser Beitrag hilft jemandem und wieder, wenn ich etwas verpasst habe und dumm bin, erziehe mich bitte!
quelle
Dies funktionierte schließlich für mich (nach viel Eile und Generieren einiger Richtlinien mit dem IBM-Richtliniengenerator). Sie können den Richtliniengenerator hier herunterladen: http://www.softpedia.com/get/Security/Security-Related/P3P-Policy-Editor.shtml
Ich konnte den Generator nicht mehr von der offiziellen IBM Website herunterladen.
Ich habe diese Dateien im Stammordner meiner Web-App erstellt
quelle
In Rails verwende ich dieses Juwel: https://github.com/merchii/rack-iframe Bawically legt es eine Reihe von Abkürzungen ohne Referenzdatei fest: https://github.com/merchii/rack-iframe/blob/master /lib/rack/iframe.rb#L8
Es ist einfach zu installieren, wenn Sie sich überhaupt nicht um die Bedeutung des p3p-Materials kümmern.
quelle
Für alle, die versuchen, die P3P Compact-Richtlinie mit statischen Inhalten zum Laufen zu bringen:
Dies ist nur möglich, wenn Sie benutzerdefinierte serverseitige Antwortheader mit statischem Inhalt senden können.
Eine ausführlichere Erklärung finden Sie in meiner Antwort hier: Legen Sie den P3P-Code in HTML fest
quelle
In Rails 3.2 verwende ich:
Ich habe dies von: http://dot-net-web-developer-bristol.blogspot.com/2012/04/setting-p3p-header-in-rails-session.html
quelle
Eine bessere Lösung wäre, einen Ajax-Aufruf innerhalb des Iframes zu der Seite zu tätigen, auf der Cookies abgerufen / gesetzt werden ...
quelle