Eu tenho dois sites, digamos que são example.com
e anotherexample.net
. Em anotherexample.net/page.html
, eu tenho um IFRAME SRC="http://example.com/someform.asp"
. Esse IFRAME exibe um formulário para o usuário preencher e enviar http://example.com/process.asp
. Quando abro o formulário (" someform.asp
") em sua própria janela do navegador, tudo funciona bem. No entanto, quando eu carrego someform.asp
como um IFRAME no IE 6 ou IE 7, os cookies de exemplo.com não são salvos. No Firefox, esse problema não aparece.
Para fins de teste, criei uma configuração semelhante em http://newmoon.wz.cz/test/page.php .
example.com
usa sessões baseadas em cookies (e não há nada que eu possa fazer sobre isso); portanto, sem cookies, process.asp
não será executado. Como forço o IE a salvar esses cookies?
Resultados da detecção do tráfego HTTP: na resposta GET /someform.asp, há um cabeçalho Set-Cookie válido por sessão (por exemplo Set-Cookie: ASPKSJIUIUGF=JKHJUHVGFYTTYFY
), mas na solicitação POST /process.asp, não há cabeçalho de Cookie.
Edit3: alguns scripts do lado do servidor AJAX + aparentemente são capazes de contornar o problema, mas isso se parece muito com um bug, além de abrir um novo conjunto de falhas de segurança . Não quero que meus aplicativos usem uma combinação de bug + brecha de segurança apenas porque é fácil.
Edit: a política P3P foi a causa raiz , explicação completa abaixo.
fonte
Respostas:
Eu consegui que funcionasse, mas a solução é um pouco complexa, então tenha paciência comigo.
O que está acontecendo
Como é, o Internet Explorer oferece menor nível de confiança às páginas IFRAME (o IE chama esse conteúdo de "terceiros"). Se a página dentro do IFRAME não tiver uma Política de Privacidade, seus cookies serão bloqueados (o que é indicado pelo ícone de olho na barra de status, quando você clica nela, mostra uma lista de URLs bloqueados).
(fonte: piskvor.org )
Nesse caso, quando os cookies são bloqueados, o identificador da sessão não é enviado e o script de destino gera um erro 'sessão não encontrada'.
(Tentei definir o identificador da sessão no formulário e carregá-lo das variáveis POST. Isso teria funcionado , mas por razões políticas eu não pude fazer isso.)
É possível tornar a página dentro do IFRAME mais confiável: se a página interna enviar um cabeçalho P3P com uma política de privacidade aceitável para o IE, os cookies serão aceitos .
Como resolver
Crie uma política p3p
Um bom ponto de partida é o tutorial do W3C . Eu passei por isso, baixei o IBM Privacy Policy Editor e lá criei uma representação da política de privacidade e dei um nome para fazer referência a ela (aqui estava
policy1
).NOTA : neste momento, você precisa descobrir se o seu site tem uma política de privacidade e, se não, criá-lo - se ele coleta dados do usuário, que tipo de dados, o que faz com ele, quem tem acesso a ele, etc. Você precisa encontrar essas informações e pensar sobre isso. Tocar algumas tags não é suficiente. Esta etapa não pode ser realizada exclusivamente em software e pode ser altamente política (por exemplo, "devemos vender nossas estatísticas de cliques?").
(por exemplo, "o site é operado pela ACME Ltd., ele usa identificadores anônimos por sessão para sua operação, coleta dados do usuário apenas se explicitamente permitido e apenas para os seguintes fins, os dados são armazenados apenas pelo tempo necessário, apenas nossa empresa tem acesso a ele, etc. etc. ").
(Ao editar com esta ferramenta, é possível visualizar erros / omissões na política. Também é muito útil a guia "Política HTML": na parte inferior, há uma "Avaliação da política" - uma verificação rápida se a política será bloqueada. pelas configurações padrão do IE)
O Editor exporta para um arquivo .p3p, que é uma representação XML da política acima. Além disso, ele pode exportar uma "versão compacta" desta política.
Link para a política
Em seguida,
http://example.com/w3c/p3p.xml
era necessário um arquivo de referência de política ( ) (um índice de políticas de privacidade que o site usa):O
<INCLUDE>
mostra todos os URIs que usarão essa política (no meu caso, o site inteiro). O arquivo de política que eu exportei do Editor foi carregado parahttp://example.com/w3c/example-com.p3p
Envie o cabeçalho compacto com respostas
Eu configurei o servidor da web em example.com para enviar o cabeçalho compacto com respostas, assim:
policyref
é um URI relativo ao arquivo de referência de política (que por sua vez faz referência às políticas de privacidade),CP
é a representação compacta da política. Observe que a combinação de cabeçalhos P3P no exemplo pode não ser aplicável em seu site específico; seus cabeçalhos P3P DEVEM representar verdadeiramente sua própria política de privacidade!Lucro!
Nessa configuração, o Evil Eye não aparece, os cookies são salvos mesmo no IFRAME e o aplicativo funciona.
Edit: O que NÃO fazer, a menos que você goste de se defender de ações judiciais
Várias pessoas sugeriram "basta colocar algumas tags no cabeçalho do P3P, até que o Evil Eye desista".
As tags não são apenas um monte de bits, elas têm significados do mundo real e seu uso dá a você responsabilidades do mundo real !
Por exemplo, fingir que você nunca coleta dados do usuário pode deixar o navegador feliz, mas se você realmente coletar dados do usuário, o P3P estará em conflito com a realidade. Puro e simples, você está mentindo de propósito para seus usuários , e isso pode ser um comportamento criminoso em alguns países. Como em "vá para a cadeia, não receba US $ 200".
Alguns exemplos ( consulte o p3pwriter para obter o conjunto completo de tags ):
STP
mas não tiver uma política de retenção, poderá estar cometendo uma fraude. Quão legal é isso? De maneira alguma.)Não sou advogado, mas não estou disposto a ir a tribunal para ver se o cabeçalho do P3P é realmente legalmente vinculativo ou se você pode prometer algo aos usuários sem realmente querer honrar suas promessas.
fonte
Passei grande parte do meu dia investigando essa coisa do P3P e sinto a necessidade de compartilhar o que descobri.
Percebi que o conceito P3P está muito desatualizado e parece apenas ser realmente usado / imposto pelo Internet Explorer (IE).
A explicação mais simples é: o IE deseja que você defina um cabeçalho P3P se estiver usando cookies.
É uma boa idéia e, felizmente, na maioria das vezes, não fornecer esse cabeçalho não causará problemas (leia os avisos do navegador). A menos que seu site / aplicativo da web seja carregado em outro site usando um (i) Frame. É aqui que o IE se torna uma dor enorme no ***. Não permitirá que você defina um cookie, a menos que o cabeçalho P3P esteja definido.
Sabendo disso, queria encontrar uma resposta para as duas perguntas a seguir:
Minhas descobertas são:
O conceito nasceu em 2002 e me deixa perplexo que esse conceito desatualizado e legalmente não implementado ainda seja imposto aos desenvolvedores no IE. Se esse cabeçalho não tiver ramificações legais, ele deverá ser ignorado (ou, alternativamente, gerar um aviso ou notificação no console). Não forçado! Agora sou forçado a colocar uma linha no meu código (e enviar um cabeçalho para o cliente) que não faz absolutamente nada.
Em resumo - para manter o IE feliz - adicione a seguinte linha ao seu código PHP (Outras linguagens devem ser similares)
Problema resolvido, e o IE está feliz com esta batata.
fonte
Potato
no meu P3P resolveu. haha!Consegui fazer com que o mau olhado desaparecesse simplesmente adicionando este pequeno cabeçalho ao site no IFrame (solução PHP):
Lembre-se de pressionar ctrl + F5 para recarregar seu site ou o Explorer ainda pode mostrar o mau-olhado, apesar de estar funcionando bem. Esta é provavelmente a principal razão pela qual tive tantos problemas para fazê-lo funcionar.
Nenhum arquivo de políticas foi necessário.
Edit: Encontrei uma boa entrada de blog que explica o problema com cookies nos IFrames. Ele também possui uma correção rápida no código C #: quadros, páginas ASPX e cookies rejeitados
fonte
CP="This_is_not_a_privacy_policy"
. Fazer isso parece menos juridicamente vinculativo, acho que (uma vez que, por exemplo NOI e STP e nada como que em tudo é mencionado), e, aparentemente, faz IE feliz :-)Isso está enterrado nos comentários de outras respostas, mas eu quase perdi, então parece que merece sua própria resposta.
Para revisar: para que o IE aceite cookies de terceiros, você precisa enviar seus arquivos com um cabeçalho http chamado p3p no formato:
MAS, o p3p está praticamente morto como padrão neste momento e você pode facilmente fazer o IE funcionar sem investir tempo e recursos legais na criação de uma política real do p3p. Isso ocorre porque, se o cabeçalho compacto da política p3p for inválido, o IE realmente o trata como uma boa política e aceita cookies de terceiros. Então você pode usar um cabeçalho p3p como este
Como opção, você pode incluir um link para uma página que explique por que você não possui uma política p3p, como o Google e o Facebook (eles apontam aqui: https://support.google.com/accounts/answer/151657 e aqui: https : //www.facebook.com/help/327993273962160/ ).
Por fim, é importante observar que todos os arquivos veiculados no site de terceiros precisam ter o cabeçalho p3p, não apenas o que define o cookie, portanto, talvez você não consiga fazer isso apenas no PHP, asp.net, etc. código. Você provavelmente está melhor configurando no nível do servidor web (ou seja, no IIS ou Apache).
fonte
Também tive esse problema, pensei em publicar o código que usei no meu projeto MVC2. Tenha cuidado quando, no ciclo de vida da página, você adicionar no cabeçalho ou obter uma HttpException "O servidor não pode anexar cabeçalho após o envio dos cabeçalhos HTTP ". Usei um ActionFilterAttribute personalizado no método OnActionExecuting (chamado antes da execução da ação).
Exemplo de uso:
fonte
Este é um ótimo tópico sobre o assunto, no entanto, descobri que um detalhe importante (que era essencial pelo menos no meu caso) que não foi publicado aqui ou em qualquer outro lugar (peço desculpas se perdi) foi que a linha P3P deve ser passou no cabeçalho de TODOS os arquivos enviados do servidor de terceiros, mesmo arquivos que não definem ou usam cookies, como imagens ou arquivos Javascript. Caso contrário, os cookies serão bloqueados. Eu tenho mais sobre isso em um post aqui: http://posheika.net/?p=110
fonte
Qualquer pessoa com esse problema no node.js.
Em seguida, adicione este módulo p3p e ative esse módulo no middleware.
Como estou usando o express, adiciono-o no app.js
Primeiro, exija esse módulo no app.js
então use-o como middleware
Ele adicionará cabeçalhos p3p no objeto res. Não há necessidade de fazer nada extra.
Você obterá mais informações em:
https://github.com/troygoode/node-p3p
fonte
Se alguém estiver procurando pela linha Apache; nós usamos este.
Realmente não importava o valor que definimos para o CP, desde que houvesse o cabeçalho P3P.
fonte
Uma possível coisa a fazer é adicionar o domínio aos sites permitidos nas ferramentas -> opções da Internet -> privacidade -> sites: somedomain.com -> permitir -> OK.
fonte
Este post fornece alguns comentários sobre o P3P e uma solução de atalho que reduz os problemas com o IE7 e IE8.
fonte
Uma solução que eu não vi mencionada aqui, está usando o armazenamento de sessão em vez de cookies. É claro que isso pode não atender aos requisitos de todos, mas, em alguns casos, é uma solução fácil.
fonte
Eu estava investigando esse problema com relação ao logon pelos Serviços de Controle de Acesso do Azure e não conseguia conectar nada.
Em seguida, deparei com esta publicação https://blogs.msdn.microsoft.com/ieinternals/2011/03/10/beware-cookie-sharing-in-cross-zone-scenarios/
Em resumo, o IE não compartilha cookies entre zonas (por exemplo, Internet x sites confiáveis).
Portanto, se o seu destino IFrame e a página html estiverem na zona diferente, o P3P não ajudará em nada.
fonte
Problema semelhante, também fui investigar como gerar a política P3P hoje de manhã, aqui está o meu post sobre como gerar sua própria política e usá-la no site :) http://everydayopenslikeaflower.blogspot.com/2009/08/ how-to-create-p3p-policy-and-implement.html
fonte
Eu implementei uma política completa do P3P antes, mas não queria passar pelo aborrecimento novamente para um novo projeto no qual estava trabalhando. Eu achei esse link útil para uma solução simples para o problema, apenas precisando especificar uma política P3P compacta mínima de "CAO PSA OUR":
http://blog.sweetxml.org/2007/10/minimal-p3p-compact-policy-suggestion.html
O artigo cita um link (agora quebrado) para um artigo da Microsoft kb. A política fez o truque para mim!
fonte
Você também pode combinar os arquivos p3p.xml e policy.xml da seguinte maneira:
/home/ubuntu/sites/shared/w3c/p3p.xml
Achei que a maneira mais fácil de adicionar um cabeçalho é proxy através do Apache e use mod_headers, como tal:
Portanto, proxy todos os pedidos, exceto aqueles para /w3c/p3p.xml, para o nosso servidor de aplicativos.
Você pode testar tudo isso com o validador W3C
fonte
Se você possui o domínio que precisa ser incorporado , antes de chamar a página que inclui o IFrame, poderá redirecionar para esse domínio, que criará o cookie e o redirecionará de volta, conforme explicado aqui: http: //www.mendoweb. be / blog / internet-explorer-safari-third-party-cookie-problem /
Isso funcionará para o Internet Explorer, mas também para o Safari (porque o Safari também bloqueia os cookies de terceiros).
fonte
Sei que é um pouco tarde para colocar minha contribuição nesse assunto, mas perdi tantas horas que talvez essa resposta ajude alguém.
Eu estava tentando chamar um cookie de terceiros no meu site e, claro, ele não estava funcionando no Internet Explorer 10, mesmo com um nível de segurança baixo ... não me pergunte o porquê. No iframe, eu estava chamando um read_cookie.php (eco $ _COOKIE) com ajax.
E não sei por que não consegui definir a política do P3P para resolver o problema ...
Durante minha pesquisa, vi algo sobre como o cookie no JSON estava funcionando. Eu nem tento, porque pensei que se o cookie não passasse por um iframe, ele não passaria mais por uma matriz ...
Adivinha o que faz! Portanto, se você json_encode seu cookie e decodificar após sua solicitação de ajax, você o receberá!
Talvez haja algo que eu perdi e, se o fiz, todas as minhas desculpas, mas eu nunca vi algo tão estúpido. Bloquear cookies de terceiros por segurança, por que não, mas deixar passar se codificado? Onde está a segurança agora?
Espero que este post ajude alguém e, novamente, se eu perdi alguma coisa e sou burro, por favor, me educe!
fonte
Isso finalmente funcionou para mim (depois de muita pressa e gerando algumas políticas usando o gerador de políticas da IBM). Você pode fazer o downlod do gerador de políticas aqui: http://www.softpedia.com/get/Security/Security-Related/P3P-Policy-Editor.shtml
Não consegui mais baixar o gerador do site oficial da IBM.
Criei esses arquivos na pasta raiz do meu Web-App
fonte
No Rails, estou usando esta gema: https://github.com/merchii/rack-iframe Bawically define um conjunto de abreviações sem um arquivo de referência: https://github.com/merchii/rack-iframe/blob/master /lib/rack/iframe.rb#L8
É fácil de instalar quando você não se importa com o significado do material p3p.
fonte
Para quem está tentando fazer com que a política compacta do P3P funcione com conteúdo estático:
É só possível se você é capaz de enviar cabeçalhos de resposta personalizado do lado do servidor com o conteúdo estático.
Para uma explicação mais detalhada, veja minha resposta aqui: Defina o código P3P em HTML
fonte
No Rails 3.2, estou usando:
Eu obtive isso em: http://dot-net-web-developer-bristol.blogspot.com/2012/04/setting-p3p-header-in-rails-session.html
fonte
Uma solução melhor seria fazer uma chamada Ajax dentro do iframe para a página que obteria / definiria cookies ...
fonte