У меня есть два сайта, скажем, они 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 , полное объяснение которой приведено ниже.
источник
Ответы:
Я получил его на работу, но решение немного сложное, так что терпите меня.
Что происходит
Таким образом, 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
понадобился файл ссылки на политику ( ) (индекс политик конфиденциальности, используемых сайтом):В
<INCLUDE>
показывает все идентификаторы URI , которые будут использовать эту политику (в моем случае, весь сайт). Файл политики, который я экспортировал из редактора, был загружен вhttp://example.com/w3c/example-com.p3p
Отправьте компактный заголовок с ответами
Я установил веб-сервер на example.com для отправки компактного заголовка с ответами, например так:
policyref
является относительным URI к файлу ссылки на политику (который, в свою очередь, ссылается на политику конфиденциальности),CP
представляет собой компактное представление политики. Обратите внимание, что комбинация заголовков P3P в этом примере может не применяться на вашем конкретном веб-сайте; Ваши заголовки P3P ДОЛЖНЫ правдиво представлять вашу собственную политику конфиденциальности!Прибыль!
В этой конфигурации Evil Eye не появляется, куки сохраняются даже в IFRAME, и приложение работает.
Изменить: Что НЕ делать, если вы не любите защищать от судебных процессов
Несколько человек предложили «просто вставить несколько тегов в заголовок P3P, пока дурной глаз не сдастся».
Теги - это не просто куча битов, они имеют значения реального мира , а их использование дает вам ответственность реального мира !
Например, притворство, что вы никогда не собираете пользовательские данные, может сделать браузер счастливым, но если вы на самом деле собираете пользовательские данные, P3P вступает в противоречие с реальностью. Проще говоря, вы целенаправленно лжете своим пользователям , и в некоторых странах это может быть преступным поведением. Например, «отправляйся в тюрьму, не собирай 200 долларов».
Несколько примеров ( полный набор тегов см. В p3pwriter ):
STP
но у вас нет политики хранения, возможно , вы совершаете мошенничество. Насколько это круто? Совсем нет.)Я не юрист, но я не хочу идти в суд, чтобы узнать, действительно ли заголовок P3P имеет юридическую силу или вы можете пообещать своим пользователям что-нибудь, фактически не желая выполнять свои обещания.
источник
Я провел большую часть своего дня, изучая P3P, и чувствую необходимость поделиться тем, что узнал.
Я заметил, что концепция P3P очень устарела и, похоже, действительно используется / поддерживается Internet Explorer (IE).
Самое простое объяснение: IE хочет, чтобы вы определяли заголовок P3P, если вы используете куки.
Это хорошая идея, и, к счастью, в большинстве случаев отсутствие этого заголовка не вызовет проблем (прочитайте предупреждения браузера). Если ваш веб-сайт / веб-приложение не загружено на другой веб-сайт с использованием (i) Frame. Это где IE становится огромной болью в ***. Это не позволит вам установить cookie, если не установлен заголовок P3P.
Зная это, я хотел найти ответ на следующие два вопроса:
Мои выводы:
Концепция родилась в 2002 году, и меня сбивает с толку тот факт, что эта устаревшая и юридически невыполненная концепция все еще навязывается разработчикам в IE. Если этот заголовок не имеет каких-либо юридических последствий, этот заголовок следует игнорировать (или, альтернативно, генерировать предупреждение или уведомление в консоли). Не применяется! Теперь я вынужден вставить строку в мой код (и отправить заголовок клиенту), которая абсолютно ничего не делает.
Короче говоря - чтобы IE был доволен - добавьте следующую строку в ваш PHP-код (другие языки должны выглядеть одинаково)
Проблема решена, и IE доволен этой картошкой.
источник
Potato
в мой P3P решил это. ха - ха!Мне удалось избавиться от дурного глаза, просто добавив этот небольшой заголовок на сайт в IFrame (решение PHP):
Не забудьте нажать Ctrl + F5, чтобы перезагрузить ваш сайт, иначе Explorer может по-прежнему показывать сглаз, несмотря на то, что он работает нормально. Вероятно, это главная причина, почему у меня было так много проблем, чтобы заставить его работать.
Никакой файл политики не был необходим вообще.
Изменить: я нашел хорошую запись в блоге, которая объясняет проблему с куки в IFrames. Также есть быстрое исправление в коде C #: фреймы, страницы ASPX и отклоненные куки
источник
CP="This_is_not_a_privacy_policy"
. Я думаю, что выполнение этого менее юридически обязательно (поскольку, например, упоминаются NOI и STP и вообще ничего подобного, и, по-видимому, делает IE счастливым :-)Это скрыто в комментариях к другим ответам, но я почти пропустил это, так что, похоже, он заслуживает своего собственного ответа.
Чтобы проверить: для того, чтобы IE принял сторонние файлы cookie, вам необходимо предоставить файлы с заголовком http, называемым p3p, в формате:
НО, p3p в значительной степени мертв как стандарт на данный момент, и вы можете легко заставить IE работать, не тратя время и юридические ресурсы на создание реальной политики p3p. Это происходит потому, что если ваш компактный p3p-заголовок политики недействителен, IE фактически воспринимает его как хорошую политику и принимает сторонние файлы cookie. Таким образом, вы можете использовать p3p заголовок, такой как этот
При желании вы можете включить ссылку на страницу, которая объясняет, почему у вас нет политики 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 (вызывается перед выполнением действия).
Пример использования:
источник
Это отличная тема по этому вопросу, однако я обнаружил, что одна важная деталь (которая была необходима, по крайней мере, в моем случае), которая не была размещена здесь или где-либо еще (я прошу прощения, если я ее пропустил), заключалась в том, что линия P3P должна быть передается в заголовке КАЖДОГО файла, отправляемого со стороннего сервера, даже если файлы не настроены или не используют файлы cookie, такие как файлы Javascript или изображения. В противном случае куки будут заблокированы. У меня есть больше об этом в сообщении здесь: http://posheika.net/?p=110
источник
Любой, имеющий эту проблему в node.js.
Затем добавьте этот модуль p3p и включите этот модуль в промежуточном программном обеспечении.
Я использую экспресс, поэтому я добавляю его в app.js
Сначала требуется этот модуль в app.js
затем использовать его в качестве промежуточного программного обеспечения
Это добавит p3p заголовки к объекту res. Не нужно делать никаких дополнительных вещей.
Вы получите больше информации по адресу:
https://github.com/troygoode/node-p3p
источник
Если кто-то ищет линию Apache; мы использовали это.
Это действительно не имело значения, какое мы устанавливаем значение CP, пока существует заголовок P3P.
источник
Одна из возможных вещей - добавить домен к разрешенным сайтам в инструментах -> Свойства обозревателя -> Конфиденциальность -> Сайты: somedomain.com -> Разрешить -> ОК.
источник
Этот пост содержит некоторые комментарии к P3P и краткому решению, которое уменьшает проблемы с IE7 и IE8.
источник
Одно из решений, о которых я не упомянул здесь, - использование хранилища сеансов вместо файлов cookie. Конечно, это может не соответствовать всем требованиям, но в некоторых случаях это легко исправить.
источник
Я исследовал эту проблему, связанную с выходом из системы через 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/ как к создать-P3P-политики-и-implement.html
источник
Я уже реализовал полную политику P3P, но не хотел снова переживать за новый проект, над которым я работал. Я нашел эту ссылку полезной для простого решения проблемы, только для того, чтобы указать минимальную компактную политику P3P «CAO PSA OUR»:
http://blog.sweetxml.org/2007/10/minimal-p3p-compact-policy-suggestion.html
Статья цитирует (теперь неработающую) ссылку на статью Microsoft kb. Политика сделала свое дело для меня!
источник
Вы также можете объединить файлы p3p.xml и policy.xml следующим образом:
/home/ubuntu/sites/shared/w3c/p3p.xml
Я обнаружил, что самый простой способ добавить заголовок - это прокси через Apache и использовать mod_headers как таковой:
Таким образом, мы отправляем все запросы, кроме тех, что /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, вы получите его!
Может быть, я что-то пропустил, и если я это сделал, все мои извинения, но я никогда не видел такой глупости. Блокируйте сторонние куки для безопасности, почему бы и нет, но пропустите их, если они закодированы? Где сейчас охрана?
Я надеюсь, что этот пост поможет кому-то и снова, если я что-то пропустил и я тупой, пожалуйста, просветите меня!
источник
Это наконец-то сработало для меня (после долгих хлопот и генерации некоторых политик с использованием генератора политик IBM). Вы можете скачать генератор политики здесь: http://www.softpedia.com/get/Security/Security-Related/P3P-Policy-Editor.shtml
Я больше не мог скачивать генератор с официального сайта IBM.
Я создал эти файлы в корневой папке моего веб-приложения
источник
В 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 я использую:
Я получил это от: http://dot-net-web-developer-bristol.blogspot.com/2012/04/setting-p3p-header-in-rails-session.html
источник
Лучшим решением было бы сделать Ajax-вызов внутри iframe на страницу, которая получит / установит куки ...
источник