Cookie заблокирован / не сохранен в IFRAME в Internet Explorer
У меня есть два сайта, скажем, они example.com
а также anotherexample.net
, На anotherexample.net/page.html
, У меня есть IFRAME SRC="http://example.com/someform.asp"
, Этот IFRAME отображает форму, которую пользователь может заполнить и отправить http://example.com/process.asp
, Когда я открываю форму (" someform.asp
") в своем окне браузера, все работает хорошо. Однако, когда я загружаю someform.asp
в качестве IFRAME в IE 6 или IE 7 файлы cookie для example.com не сохраняются. В Firefox эта проблема не появляется.
В целях тестирования я создал аналогичную настройку на http://newmoon.wz.cz/test/page.php.
example.com
использует сеансы на основе файлов cookie (и я ничего не могу с этим поделать), поэтому без файлов cookie process.asp
не выполнит Как заставить IE сохранить эти куки?
Результаты перехвата HTTP-трафика: в ответе GET /someform.asp имеется действительный заголовок Set-Cookie для каждой сессии (например, Set-Cookie: ASPKSJIUIUGF=JKHJUHVGFYTTYFY
), но в запросе POST /process.asp заголовок Cookie отсутствует вообще.
Edit3: некоторые серверные скрипты AJAX+, по-видимому, способны обойти проблему, но это очень похоже на ошибку, плюс открывает целый ряд новых дыр в безопасности. Я не хочу, чтобы мои приложения использовали комбинацию баг + дыра в безопасности только потому, что это легко.
Изменить: основной причиной была политика P3P, полное объяснение которой приведено ниже.
22 ответа
Я получил его на работу, но решение немного сложное, так что терпите меня.
Что происходит
Таким образом, Internet Explorer обеспечивает более низкий уровень доверия страницам IFRAME (IE называет это "сторонним" контентом). Если страница внутри IFRAME не имеет Политики конфиденциальности, ее куки блокируются (что обозначается значком глаза в строке состояния, при нажатии на который отображается список заблокированных URL-адресов).
(источник: piskvor.org)
В этом случае, когда куки блокируются, идентификатор сеанса не отправляется, и целевой скрипт выдает ошибку "сеанс не найден".
(Я попытался установить идентификатор сессии в форму и загрузить его из переменных POST. Это сработало бы, но по политическим причинам я не смог этого сделать.)
Можно сделать страницу внутри IFRAME более надежной: если внутренняя страница отправляет заголовок P3P с политикой конфиденциальности, приемлемой для IE, файлы cookie будут приняты.
Как это решить
Создайте политику p3p
Хорошей отправной точкой является учебник по W3C. Я прошел через это, скачал Редактор политики конфиденциальности IBM и там я создал представление политики конфиденциальности и дал ему имя для ссылки на него (здесь это было policy1
).
ПРИМЕЧАНИЕ: на данный момент вам действительно нужно выяснить, есть ли на вашем сайте политика конфиденциальности, а если нет, то создать ее - собирает ли она пользовательские данные, какие данные, что с ними происходит, кто имеет к ней доступ, и т.д. Вам нужно найти эту информацию и подумать об этом. Просто сложив несколько тегов, вы не обрежете его. Этот шаг не может быть сделан исключительно в программном обеспечении и может быть очень политическим (например, "мы должны продавать нашу статистику кликов?").
(например, "сайт управляется ACME Ltd., он использует анонимные идентификаторы сеанса для своей работы, собирает пользовательские данные только в случае явного разрешения и только для следующих целей, данные хранятся только столько времени, сколько необходимо, только наша компания"). имеет к нему доступ и т. д. и т. д.).
(При редактировании с помощью этого инструмента можно просматривать ошибки / пропуски в политике. Также очень полезна вкладка "Политика HTML": в нижней части находится "Оценка политики" - быстрая проверка, будет ли политика заблокирована по умолчанию в настройках IE)
Редактор экспортирует в файл.p3p, который представляет собой XML-представление вышеуказанной политики. Кроме того, он может экспортировать "компактную версию" этой политики.
Ссылка на политику
Затем файл ссылки на политику (http://example.com/w3c/p3p.xml
) был необходим (индекс политик конфиденциальности сайта):
<META>
<POLICY-REFERENCES>
<POLICY-REF about="/w3c/example-com.p3p#policy1">
<INCLUDE>/</INCLUDE>
<COOKIE-INCLUDE/>
</POLICY-REF>
</POLICY-REFERENCES>
</META>
<INCLUDE>
показывает все URI, которые будут использовать эту политику (в моем случае, весь сайт). Файл политики, который я экспортировал из редактора, был загружен в http://example.com/w3c/example-com.p3p
Отправьте компактный заголовок с ответами
Я установил веб-сервер на example.com для отправки компактного заголовка с ответами, например так:
HTTP/1.1 200 OK
P3P: policyref="/w3c/p3p.xml", CP="IDC DSP COR IVAi IVDi OUR TST"
// ... other headers and content
policyref
является относительным URI к файлу ссылки на политику (который, в свою очередь, ссылается на политики конфиденциальности), CP
это компактное представление политики. Обратите внимание, что комбинация заголовков P3P в этом примере может не применяться на вашем конкретном веб-сайте; Ваши заголовки P3P ДОЛЖНЫ правдиво представлять вашу собственную политику конфиденциальности!
Прибыль!
В этой конфигурации Evil Eye не появляется, куки сохраняются даже в IFRAME, и приложение работает.
Изменить: Что НЕ делать, если вы не любите защищать от судебных процессов
Несколько человек предложили "просто вставить несколько тегов в заголовок P3P, пока дурной глаз не сдастся".
Теги - это не просто куча битов, они имеют значения реального мира, а их использование дает вам ответственность реального мира!
Например, притворство, что вы никогда не собираете пользовательские данные, может сделать браузер счастливым, но если вы на самом деле собираете пользовательские данные, P3P вступает в противоречие с реальностью. Проще говоря, вы целенаправленно лжете своим пользователям, и в некоторых странах это может быть преступным поведением. Например, "отправляйся в тюрьму, не собирай 200 долларов".
Несколько примеров ( полный набор тегов см. В p3pwriter):
- NOI: "Веб-сайт не собирает идентифицированные данные". (как только появится какая-либо настройка, логин или какой-либо сбор данных (***** Analytics, кто-нибудь?), вы должны подтвердить это в своем P3P)
- STP: Информация сохраняется для достижения заявленной цели. Это требует, чтобы информация была удалена как можно раньше. Сайты ДОЛЖНЫ иметь политику хранения, которая устанавливает расписание уничтожения. Политика хранения ДОЛЖНА быть включена или связана с понятной для человека политикой конфиденциальности сайта ".
STP
но у вас нет политики хранения, возможно, вы совершаете мошенничество. Как это круто? Не за что.)
Я не юрист, но я не хочу идти в суд, чтобы узнать, действительно ли заголовок P3P имеет юридическую силу или вы можете пообещать своим пользователям что-нибудь, фактически не желая выполнять свои обещания.
Я провел большую часть своего дня, изучая P3P, и чувствую необходимость поделиться тем, что я узнал.
Я заметил, что концепция P3P очень устарела и, похоже, действительно используется / поддерживается Internet Explorer (IE).
Самое простое объяснение: IE хочет, чтобы вы определяли заголовок P3P, если вы используете куки.
Это хорошая идея, и, к счастью, в большинстве случаев отсутствие этого заголовка не вызывает проблем (читайте предупреждения браузера). Если ваш веб-сайт / веб-приложение не загружены на другой веб-сайт с использованием (i)Frame. Это где IE становится огромной болью в ***. Это не позволит вам установить cookie, если не установлен заголовок P3P.
Зная это, я хотел найти ответ на следующие два вопроса:
- Какая разница? Другими словами, можно ли подать в суд, если я добавлю слово "Картофель" в заголовок?
- Что делают другие компании?
Мои выводы:
- Всем всеравно. Я не могу найти ни одного документа, который предполагает, что эта технология имеет какой-либо юридический вес. Во время моего исследования я не нашел ни одной страны в мире, которая приняла бы закон, который запрещает вам добавлять слово "Картофель" в заголовок P3P.
- И Google, и Facebook помещают ссылку в поле заголовка P3P, ссылающуюся на страницу, объясняющую, почему у них нет заголовка P3P.
Концепция родилась в 2002 году, и меня сбивает с толку тот факт, что эта устаревшая и юридически невыполненная концепция все еще навязывается разработчикам в IE. Если этот заголовок не имеет каких-либо юридических последствий, этот заголовок следует игнорировать (или, альтернативно, генерировать предупреждение или уведомление в консоли). Не применяется! Теперь я вынужден вставить строку в мой код (и отправить заголовок клиенту), которая абсолютно ничего не делает.
Короче говоря - чтобы IE был доволен - добавьте следующую строку в ваш PHP-код (другие языки должны выглядеть одинаково)
header('P3P: CP="Potato"');
Проблема решена, и IE доволен этой картошкой.
Мне удалось избавиться от дурного глаза, просто добавив этот небольшой заголовок на сайт в IFrame (решение PHP):
header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');
Не забудьте нажать Ctrl+F5, чтобы перезагрузить ваш сайт, иначе Explorer может по-прежнему показывать сглаз, несмотря на то, что он работает нормально. Это, вероятно, главная причина, почему у меня было так много проблем, чтобы заставить его работать.
Никакой файл политики не был необходим вообще.
Изменить: я нашел хорошую запись в блоге, которая объясняет проблему с файлами cookie в IFrames. Также есть быстрое исправление в коде C#: фреймы, страницы ASPX и отклоненные куки
Это скрыто в комментариях к другим ответам, но я почти пропустил это, так что, похоже, он заслуживает своего собственного ответа.
Чтобы проверить: для того, чтобы IE мог принимать сторонние куки, вам нужно предоставить свои файлы с заголовком http, называемым p3p, в формате:
CP="my compact p3p policy"
НО, p3p в значительной степени мертв как стандарт на данный момент, и вы можете легко заставить IE работать, не вкладывая время и юридические ресурсы в создание реальной политики p3p. Это связано с тем, что если ваш компактный заголовок политики p3p недействителен, IE фактически считает его хорошей политикой и принимает сторонние файлы cookie. Таким образом, вы можете использовать p3p заголовок, такой как этот
CP="This site does not have a p3p policy."
При желании вы можете включить ссылку на страницу, которая объясняет, почему у вас нет политики p3p, как это делают Google и Facebook (они указывают здесь: https://support.google.com/accounts/answer/151657 и здесь: https://www.facebook.com/help/327993273962160/).
Наконец, важно отметить, что все файлы, обслуживаемые сторонним сайтом, должны иметь заголовок p3p, а не только тот, который устанавливает cookie, поэтому вы не сможете просто сделать это в своем PHP, asp.net и т. Д. код. Возможно, вам лучше настроить на уровне веб-сервера (то есть в IIS или Apache).
У меня тоже была эта проблема, я решил опубликовать код, который использовал в своем проекте MVC2. Будьте осторожны, когда в жизненном цикле страницы вы добавляете заголовок, или вы получаете HttpException "Сервер не может добавить заголовок после отправки заголовков HTTP". Я использовал собственный ActionFilterAttribute в методе OnActionExecuting (вызывается перед выполнением действия).
/// <summary>
/// Privacy Preferences Project (P3P) serve a compact policy (a "p3p" HTTP header) for all requests
/// P3P provides a standard way for Web sites to communicate about their practices around the collection,
/// use, and distribution of personal information. It's a machine-readable privacy policy that can be
/// automatically fetched and viewed by users, and it can be tailored to fit your company's specific policies.
/// </summary>
/// <remarks>
/// More info http://www.oreillynet.com/lpt/a/1554
/// </remarks>
public class P3PAttribute : ActionFilterAttribute
{
/// <summary>
/// On Action Executing add a compact policy "p3p" HTTP header
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext.Current.Response.AddHeader("p3p","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
base.OnActionExecuting(filterContext);
}
}
Пример использования:
[P3P]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome!";
return View();
}
public ActionResult About()
{
return View();
}
}
Это отличная тема по этому вопросу, однако я обнаружил, что одна важная деталь (которая была необходима, по крайней мере, в моем случае), которая не была опубликована здесь или где-либо еще (я прошу прощения, если я ее пропустил), заключалась в том, что линия P3P должна быть передается в заголовке КАЖДОГО файла, отправленного со стороннего сервера, даже если файлы не настроены или не используют файлы cookie, такие как файлы Javascript или изображения. В противном случае куки будут заблокированы. У меня есть больше об этом в сообщении здесь: http://posheika.net/?p=110
Любой, имеющий эту проблему в node.js.
Затем добавьте этот модуль p3p и включите этот модуль в промежуточном программном обеспечении.
npm install p3p
Я использую экспресс, поэтому я добавляю его в app.js
Сначала требуется этот модуль в app.js
var express = require('express');
var app = express();
var p3p = require('p3p');
затем использовать его в качестве промежуточного программного обеспечения
app.use(p3p(p3p.recommended));
Это добавит p3p заголовки к объекту res. Не нужно делать никаких лишних вещей.
Вы получите больше информации по адресу:
Если кто-то ищет линию Apache; мы использовали это.
Заголовок установлен P3P "CP=\" Спасибо IE8\""
Это действительно не имело значения, какое мы устанавливаем значение CP, пока есть заголовок P3P.
Одна из возможных вещей - добавить домен к разрешенным сайтам в инструментах -> Свойства обозревателя -> Конфиденциальность -> Сайты: somedomain.com -> Разрешить -> ОК.
Одно из решений, о которых я здесь не упоминал, - использование хранилища сеансов вместо файлов cookie. Конечно, это может не соответствовать всем требованиям, но в некоторых случаях это легко исправить.
Этот пост содержит некоторые комментарии к P3P и краткому решению, которое уменьшает проблемы с IE7 и IE8.
Я исследовал эту проблему, связанную с выходом из системы через Azure Access Control Services, и не смог соединить все что угодно.
Затем наткнулся на этот пост https://blogs.msdn.microsoft.com/ieinternals/2011/03/10/beware-cookie-sharing-in-cross-zone-scenarios/
Короче говоря, IE не разделяет файлы cookie между зонами (например, Интернет и доверенные сайты).
Так что, если ваша цель IFrame и html-страница находятся в другой зоне, P3P не поможет ни с чем.
Получил аналогичную проблему, а также пошел, чтобы исследовать, как генерировать политику P3P сегодня утром, вот мой пост о том, как создать свою собственную политику и использовать на веб-сайте:) http://everydayopenslikeaflower.blogspot.com/2009/08/how-to-create-p3p-policy-and-implement.html
Я уже реализовал полную политику P3P, но не хотел снова переживать за новый проект, над которым я работал. Я нашел эту ссылку полезной для простого решения проблемы, только для того, чтобы указать минимальную компактную политику P3P "CAO PSA OUR":
http://blog.sweetxml.org/2007/10/minimal-p3p-compact-policy-suggestion.html
Статья цитирует (теперь неработающую) ссылку на статью Microsoft kb. Политика сделала свое дело для меня!
Это наконец-то сработало для меня (после долгих хлопот и генерации некоторых политик с использованием генератора политик IBM). Вы можете загрузить генератор политики здесь: http://www.softpedia.com/get/Security/Security-Related/P3P-Policy-Editor.shtml
Я больше не мог скачивать генератор с официального сайта IBM.
Я создал эти файлы в корневой папке моего веб-приложения
/index.php
/w3c/policy.html (Human readable format)
/w3c/p3p.xml
/w3c/policy.p3p
- Index.php: Просто отправьте дополнительный заголовок:
header('P3P: policyref="/w3c/p3p.xml", CP="ALL DSP NID CURa ADMa DEVa HISa OTPa OUR NOR NAV DEM"');
- Содержание p3p.xml
<META>
<POLICY-REFERENCES>
<POLICY-REF about="/w3c/policy.p3p#App">
<INCLUDE>/</INCLUDE>
<COOKIE-INCLUDE/>
</POLICY-REF>
</POLICY-REFERENCES>
</META>
- Содержимое моего файла policy.html
<html>
<head>
<STYLE type="text/css">
title { color: #3333FF}
</STYLE>
<title>Privacy Statement for YOUR COMPANY NAME</title>
</head>
<body>
<h1 class="title">Privacy Policy</h1>
<!-- "About Us" section of privacy policy -->
<h2>About Us</h2>
<p>This is a privacy policy for YOUR COMPANY NAME.
Our homepage on the Web is located at <a href="YOURWEBSITE">
YOURWEBSITE</a>.
The full text of our privacy policy is available on the Web at
<a href="ABSOLUTE URL OF THIS FILE">
ABSOLUTE URL OF THIS FILE</a>
This policy does not tell users where they can go to exercise their opt-in or opt-out options.
<p>We invite you to contact us if you have questions about this policy.
You may contact us by mail at the following address:
<pre>FIRSTNAME LASTNAME
YOUR ADDRESS HERE
</pre>
<p>You may contact us by e-mail at
<a href="mailto:info@YOURMAIL.de">
info@YOURMAIL.eu</a>.
You may call us at TELEPHONENUMBER.
<!-- "Privacy Seals" section of privacy policy -->
<h2>Dispute Resolution and Privacy Seals</h2>
<p>We have the following privacy seals and/or dispute resolution mechanisms.
If you think we have not followed our privacy policy in some way, they can help you resolve your concern.
<ul>
<li>
<b>Dispute</b>:
Contact us for further information
</ul>
<!-- "Additional information" section of privacy policy -->
<h2>Additional Information</h2>
<p>
This policy is valid for 1 day from the time that it is loaded by a client.
</p>
<!-- "Data Collection" section of privacy policy -->
<h2>Data Collection</h2>
<p>P3P policies declare the data they collect in groups (also referred to as "statements").
This policy contains 1 data group.
<hr width="50%" align="center">
<h3>Group "App control data"</h3>
<p>We collect the following information:
<ul>
<li>HTTP cookies</li>
</ul>
<p>This data will be used for the following purposes:</p>
<ul>
<li>Completion and support of the current activity.</li>
<li>Web site and system administration.</li>
<li>Research and development.</li>
<li>Historical preservation.</li>
<li>Other purposes<p>Control Flow of the application</p></li>
</ul>
<p>This data will be used by ourselves and our agents.
<p>The data in this group has been marked as non-identifiable. This means that there is no
reasonable way for the site to identify the individual person this data was collected from.
<p>The following explanation is provided for why this data is collected:</p>
<blockquote>This cookie data is only used to control the application within an iframe (e.g. a Facebook App)</blockquote>
<!-- "Use of Cookies" section of privacy policy -->
<hr width="50%" align="center">
<h2>Cookies</h2>
<p>Cookies are a technology which can be used to provide you with tailored information from a Web site. A cookie is an element of data that a Web site can send to your browser, which may then store it on your system. You can set your browser to notify you when you receive a cookie, giving you the chance to decide whether to accept it.
<p>Our site makes use of cookies.
Cookies are used for the following purposes:
<ul>
<li>Site administration
<li>Completing the user's current activity
<li>Research and development
<li>Other
(Control Flow of the application)
</ul>
<!-- "Compact Policy Explanation" section of privacy policy -->
<hr width="50%" align="center">
<h2>Compact Policy Summary</h2>
<p>The compact policy which corresponds to this policy is:
<pre>
CP="ALL DSP NID CURa ADMa DEVa HISa OTPa OUR NOR NAV"
</pre>
<p>The following table explains the meaning of each field in the compact policy.
<center><table width="80%" border="1" cols="2">
<tr><td align="center" valign="top" width="20%"><b>Field</b></td><td align="center" valign="top" width="80%"><b>Meaning</b></td></tr>
<tr><td align="left" valign="top" width="20%"><tt>CP=</tt></td>
<td align="left" valign="top" width="80%">This is the compact policy header; it indicates that what follows is a P3P compact policy.</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>ALL</tt></td>
<td align="left" valign="top" width="80%">
Access to all collected information is available.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>DSP</tt></td>
<td align="left" valign="top" width="80%">
The policy contains at least one dispute-resolution mechanism.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>NID</tt></td>
<td align="left" valign="top" width="80%">
The information collected is not personally identifiable.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>CURa</tt></td>
<td align="left" valign="top" width="80%">
The data is used for completion of the current activity.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>ADMa</tt></td>
<td align="left" valign="top" width="80%">
The data is used for site administration.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>DEVa</tt></td>
<td align="left" valign="top" width="80%">
The data is used for research and development.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>HISa</tt></td>
<td align="left" valign="top" width="80%">
The data is used for historical archival purposes.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>OTPa</tt></td>
<td align="left" valign="top" width="80%">
The data is used for other purposes.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>OUR</tt></td>
<td align="left" valign="top" width="80%">
The data is given to ourselves and our agents.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>NOR</tt></td>
<td align="left" valign="top" width="80%">
The data is not kept beyond the current transaction.
</td></tr>
<tr><td align="left" valign="top" width="20%"><tt>NAV</tt></td>
<td align="left" valign="top" width="80%">
Navigation and clickstream data is collected.
</td></tr>
</table></center>
<p>The compact policy is sent by the Web server along with the cookies it describes.
For more information, see the P3P deployment guide at <a href="http://www.w3.org/TR/p3pdeployment">http://www.w3.org/TR/p3pdeployment</a>.
<!-- "Policy Evaluation" section of privacy policy -->
<hr width="50%" align="center">
<h2>Policy Evaluation</h2>
<p>Microsoft Internet Explorer 6 will evaluate this policy's compact policy whenever it is used with a cookie.
The actions IE will take depend on what privacy level the user has selected in their browser (Low, Medium, Medium High, or High; the default is Medium.
In addition, IE will examine whether the cookie's policy is considered satisfactory or unsatisfactory, whether the cookie is a session cookie or a persistent cookie, and whether the cookie is used in a first-party or third-party context.
This section will attempt to evaluate this policy's compact policy against Microsoft's stated behavior for IE6.
<p><b>Note:</b> this evaluation is currently experimental and should not be considered a substitute for testing with a real Web browser.
<p><b>Satisfactory policy</b>: this compact policy is considered <em>satisfactory</em> according to the rules defined by Internet Explorer 6.
IE6 will accept cookies accompanied by this policy under the High, Medium High, Medium, Low, and Accept All Cookies settings.
</body></html>
- Содержание policy.p3p
<?xml version="1.0"?>
<POLICIES xmlns="http://www.w3.org/2002/01/P3Pv1">
<!-- Generated by IBM P3P Policy Editor version Beta 1.12 built 2/27/04 1:19 PM -->
<!-- Expiry information for this policy -->
<EXPIRY max-age="86400"/>
<POLICY
name="App"
discuri="ABSOLUTE URL TO policy.html"
xml:lang="de">
<!-- Description of the entity making this policy statement. -->
<ENTITY>
<DATA-GROUP>
<DATA ref="#business.name">COMPANY NAME</DATA>
<DATA ref="#business.contact-info.online.email">info@YOURMAIL.eu</DATA>
<DATA ref="#business.contact-info.online.uri">YOURWEBSITE</DATA>
<DATA ref="#business.contact-info.telecom.telephone.number">YOURPHONENUMBER</DATA>
<DATA ref="#business.contact-info.postal.organization">FIRSTNAME LASTNAME</DATA>
<DATA ref="#business.contact-info.postal.street">STREET</DATA>
<DATA ref="#business.contact-info.postal.city">CITY</DATA>
<DATA ref="#business.contact-info.postal.stateprov">STAGE</DATA>
<DATA ref="#business.contact-info.postal.postalcode">POSTALCODE</DATA>
<DATA ref="#business.contact-info.postal.country">Germany</DATA>
</DATA-GROUP>
</ENTITY>
<!-- Disclosure -->
<ACCESS><all/></ACCESS>
<!-- Disputes -->
<DISPUTES-GROUP>
<DISPUTES resolution-type="service" service="YOURWEBSITE CONTACT FORM" short-description="Dispute">
<LONG-DESCRIPTION>Contact us for further information</LONG-DESCRIPTION>
<!-- No remedies specified -->
</DISPUTES>
</DISPUTES-GROUP>
<!-- Statement for group "App control data" -->
<STATEMENT>
<EXTENSION optional="yes">
<GROUP-INFO xmlns="http://www.software.ibm.com/P3P/editor/extension-1.0.html" name="App control data"/>
</EXTENSION>
<!-- Consequence -->
<CONSEQUENCE>
This cookie data is only used to control the application within an iframe (e.g. a Facebook App)</CONSEQUENCE>
<!-- Data in this statement is marked as being non-identifiable -->
<NON-IDENTIFIABLE/>
<!-- Use (purpose) -->
<PURPOSE><admin/><current/><develop/><historical/><other-purpose>Control Flow of the application</other-purpose></PURPOSE>
<!-- Recipients -->
<RECIPIENT><ours/></RECIPIENT>
<!-- Retention -->
<RETENTION><no-retention/></RETENTION>
<!-- Base dataschema elements. -->
<DATA-GROUP>
<DATA ref="#dynamic.cookies"><CATEGORIES><navigation/></CATEGORIES></DATA>
</DATA-GROUP>
</STATEMENT>
<!-- End of policy -->
</POLICY>
</POLICIES>
Вы также можете объединить файлы p3p.xml и policy.xml следующим образом:
/home/ubuntu/sites/shared/w3c/p3p.xml
<META xmlns="http://www.w3.org/2002/01/P3Pv1">
<POLICY-REFERENCES>
<POLICY-REF about="#policy1">
<INCLUDE>/</INCLUDE>
<COOKIE-INCLUDE/>
</POLICY-REF>
</POLICY-REFERENCES>
<POLICIES>
<POLICY discuri="" name="policy1">
<ENTITY>
<DATA-GROUP>
<DATA ref="#business.name"></DATA>
<DATA ref="#business.contact-info.online.email"></DATA>
</DATA-GROUP>
</ENTITY>
<ACCESS>
<nonident/>
</ACCESS>
<!-- if the site has a dispute resolution procedure that it follows, a DISPUTES-GROUP should be included here -->
<STATEMENT>
<PURPOSE>
<current/>
<admin/>
<develop/>
</PURPOSE>
<RECIPIENT>
<ours/>
</RECIPIENT>
<RETENTION>
<indefinitely/>
</RETENTION>
<DATA-GROUP>
<DATA ref="#dynamic.clickstream"/>
<DATA ref="#dynamic.http"/>
</DATA-GROUP>
</STATEMENT>
</POLICY>
</POLICIES>
</META>
Я обнаружил, что самый простой способ добавить заголовок - это прокси через Apache и использовать mod_headers как таковой:
<VirtualHost *:80>
ServerName mydomain.com
DocumentRoot /home/ubuntu/sites/shared/w3c/
ProxyRequests off
ProxyPass /w3c/ !
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
ProxyPreserveHost on
Header add p3p 'P3P:policyref="/w3c/p3p.xml", CP="NID DSP ALL COR"'
</VirtualHost>
Таким образом, мы отправляем все запросы, кроме тех, что /w3c/p3p.xml на наш сервер приложений.
Вы можете проверить все это с помощью валидатора W3C
Если вы являетесь владельцем домена, который необходимо встроить, то перед вызовом страницы, содержащей IFrame, вы можете перенаправить на этот домен, который создаст cookie и перенаправит назад, как описано здесь: http: //www.mendoweb. быть / блог / интернет-исследователь-сафари-третьи стороны-печенье проблемы /
Это будет работать для Internet Explorer, но также и для Safari (поскольку Safari также блокирует сторонние файлы cookie).
Я знаю, что уже поздно вносить свой вклад в эту тему, но я потерял столько часов, что, возможно, этот ответ кому-нибудь поможет.
Я пытался вызвать сторонний файл cookie на моем сайте, и, конечно, он не работал в Internet Explorer 10 даже при низком уровне безопасности... не спрашивайте меня, почему. В iframe я вызывал read_cookie.php (echo $_COOKIE) с помощью ajax.
И я не знаю, почему я был неспособен установить политику P3P для решения проблемы...
Во время поиска я увидел кое-что о том, как заставить работать cookie в JSON. Я даже не пытался, потому что думал, что если cookie не пройдет через iframe, он больше не пройдет через массив...
Угадай что, это делает! Так что, если вы json_encode вашего cookie, а затем декодировать после вашего запроса AJAX, вы получите его!
Может быть, я что-то пропустил, и если я это сделал, все мои извинения, но я никогда не видел такой глупости. Блокируйте сторонние куки для безопасности, почему бы и нет, но пропустите их, если они закодированы? Где сейчас охрана?
Надеюсь, этот пост кому-нибудь поможет и снова, если я что-то пропустил и я тупой, пожалуйста, просветите меня!
В Rails я использую этот гем: https://github.com/merchii/rack-iframe Бавически он устанавливает набор сокращений без справочного файла: https://github.com/merchii/rack-iframe/blob/master/lib/rack/iframe.rb#L8
Его легко установить, если вас не волнует значение p3p.
Для тех, кто пытается заставить P3P Compact Policy работать со статическим контентом:
Это возможно только в том случае, если вы можете отправлять пользовательские заголовки ответа на стороне сервера со статическим содержимым.
Для более подробного объяснения см. Мой ответ здесь: Установите код P3P в HTML
В Rails 3.2 я использую:
class ApplicationController < ActionController::Base
before_filter :set_p3p
private
# for IE session cookies thru iframe
def set_p3p
headers['P3P'] = 'CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV"'
end
end
Я получил это от: http://dot-net-web-developer-bristol.blogspot.com/2012/04/setting-p3p-header-in-rails-session.html
Лучшим решением было бы сделать Ajax-вызов внутри iframe на страницу, которая получит / установит куки...