Cookie заблокирован / не сохранен в IFRAME в Internet Explorer - PullRequest
389 голосов
/ 23 декабря 2008

У меня есть два веб-сайта, скажем, они 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 ]

427 голосов
/ 23 декабря 2008

Я заставил его работать, но решение немного сложное, так что терпите меня.

Что происходит

Как таковой, Internet Explorer обеспечивает более низкий уровень доверия страницам IFRAME (IE называет это «сторонним» контентом). Если страница внутри IFRAME не имеет Политики конфиденциальности, ее файлы cookie блокируются (что обозначается значком глаза в строке состояния, при нажатии на который отображается список заблокированных URL-адресов).

the evil eye
(источник: 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 действительно юридически обязательным или если вы можете пообещать своим пользователям что-нибудь, не желая соблюдать обещает.

165 голосов
/ 10 мая 2013

Я провел большую часть своего дня, изучая P3P, и чувствую необходимость поделиться тем, что узнал.

Я заметил, что концепция P3P очень устарела и, похоже, действительно используется / поддерживается Internet Explorer (IE).

Самое простое объяснение: IE хочет, чтобы вы определяли заголовок P3P, если вы используете куки.

Это хорошая идея, и, к счастью, в большинстве случаев отсутствие этого заголовка не вызовет никаких проблем (прочитайте предупреждения браузера). Если ваш веб-сайт / веб-приложение не загружено на другой веб-сайт с использованием (i) Frame. Это где IE становится огромной болью в ***. Это не позволит вам установить cookie, если не установлен заголовок P3P.

Зная это, я хотел найти ответ на следующие два вопроса:

  1. Кого это волнует? Другими словами, можно ли подать в суд, если я добавлю слово «Картофель» в заголовок?
  2. Что делают другие компании?

Мои выводы:

  1. Никому нет дела. Я не могу найти ни одного документа, который предполагает, что эта технология имеет какой-либо юридический вес. Во время моего исследования я не нашел ни одной страны в мире, которая бы приняла закон, который запрещает вам вставлять слово «Картофель» в заголовок P3P
  2. Как Google, так и Facebook поместили в поле заголовка P3P ссылку, указывающую на страницу, объясняющую, почему у них нет заголовка P3P.

Концепция родилась в 2002 году, и меня удивляет, что эта устаревшая и юридически невыполненная концепция все еще навязывается разработчикам в IE. Если этот заголовок не имеет каких-либо юридических последствий, этот заголовок следует игнорировать (или, альтернативно, генерировать предупреждение или уведомление в консоли). Не применяется! Теперь я вынужден вставить строку в мой код (и отправить заголовок клиенту), которая абсолютно ничего не делает.

Вкратце - чтобы IE был доволен - добавьте следующую строку в ваш код PHP (другие языки должны выглядеть одинаково)

header('P3P: CP="Potato"');

Проблема решена, и IE доволен этой картошкой.

55 голосов
/ 19 февраля 2010

Мне удалось избавиться от сглаза, просто добавив этот небольшой заголовок на сайт в IFrame (решение PHP):

header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');

Не забудьте нажать Ctrl + F5 , чтобы перезагрузить сайт, иначе Explorer может по-прежнему показывать сглаз, несмотря на то, что он работает нормально. Вероятно, это основная причина, по которой у меня было так много проблем, чтобы заставить его работать.

Файл политики вообще не был необходим.

Edit: Я нашел хорошую запись в блоге, которая объясняет проблему с файлами cookie в IFrames. Это также имеет быстрое исправление в коде C #: Фреймы, страницы ASPX и отклоненные файлы cookie

21 голосов
/ 24 мая 2013

Это скрыто в комментариях к другим ответам, но я чуть не пропустил его, так что, похоже, оно заслуживает своего собственного ответа.

Чтобы проверить: для того, чтобы IE принял сторонние файлы cookie, вам нужно предоставить свои файлы с заголовком 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. чистый и т. д. код. Возможно, вам лучше настроить на уровне веб-сервера (то есть в IIS или Apache).

20 голосов
/ 27 октября 2011

У меня тоже была эта проблема, я думал выложить код, который использовал в своем проекте 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();
    }
}
14 голосов
/ 24 августа 2010

Это отличная тема по этому вопросу, однако я обнаружил, что одной важной деталью (которая была необходима, по крайней мере, в моем случае), которая не была опубликована здесь или где-либо еще (я прошу прощения, если я ее пропустил), было то, что P3P строка должна быть передана в заголовке файла EVERY , отправленного со стороннего сервера, даже если файлы не настроены или не используют файлы cookie, такие как файлы Javascript или изображения. В противном случае куки будут заблокированы. У меня есть больше об этом в сообщении здесь: http://posheika.net/?p=110

5 голосов
/ 08 января 2014

Если кто-то ищет линию Apache; мы использовали это.

Заголовок установлен P3P "CP = \" Спасибо IE8 \ ""

Это действительно не имело значения, какое мы устанавливаем значение CP, пока существует заголовок P3P.

5 голосов
/ 17 апреля 2013

Любой, у кого есть эта проблема в 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. Не нужно делать никаких дополнительных вещей.

Вы получите больше информации по адресу:

https://github.com/troygoode/node-p3p

3 голосов
/ 13 июня 2012

Одно из решений, которое я здесь не упоминал, - это использование хранилища сессий вместо файлов cookie. Конечно, это может не соответствовать всем требованиям, но в некоторых случаях это легко исправить.

3 голосов
/ 05 апреля 2011

Этот пост содержит некоторые комментарии к P3P и краткому решению, которое уменьшает проблемы с IE7 и IE8.

...