[internet-explorer] Internet Explorer에서 쿠키가 차단되거나 IFRAME에 저장되지 않음

나는 두 개의 웹 사이트를 가지고의 그들이있어 가정 해 봅시다 example.comanotherexample.net. 에 anotherexample.net/page.html, 나는이 IFRAME SRC="http://example.com/someform.asp". IFRAME은 사용자가 작성하여 제출할 양식을 표시합니다 http://example.com/process.asp. someform.asp자체 브라우저 창에서 양식 ( ” “)을 열면 모든 것이 잘 작동합니다. 그러나 IE 6 또는 IE 7에서 IFRAME으로 로드 someform.asp하면 example.com의 쿠키가 저장되지 않습니다. Firefox에서는이 문제가 나타나지 않습니다.

테스트 목적으로 http://newmoon.wz.cz/test/page.php 에서 비슷한 설정을 만들었습니다 .

example.com쿠키 기반 세션을 사용하므로 쿠키를 사용하지 process.asp않으면 실행할 수 없습니다. IE가 쿠키를 저장하도록하려면 어떻게해야합니까?

HTTP 트래픽 스니핑 결과 : GET /someform.asp 응답에 유효한 세션 별 Set-Cookie 헤더 (예 Set-Cookie: ASPKSJIUIUGF=JKHJUHVGFYTTYFY:)가 있지만 POST /process.asp 요청에는 쿠키 헤더가 전혀 없습니다.

Edit3 : 일부 AJAX + 서버 측 스크립팅은 분명히 문제를 피할 수는 있지만 버그와 매우 유사하며 완전히 새로운 보안 취약점을 열어 줍니다. 내 응용 프로그램이 쉬운 이유만으로 버그 + 보안 허문 조합을 사용하고 싶지 않습니다.

편집 : P3P 정책은 근본 원인 이며 아래에 전체 설명이 있습니다.



답변

나는 그것이 효과가 있었지만 해결책은 약간 복잡하므로 나와 함께 견뎌야한다.

무슨 일이야

Internet Explorer는 IFRAME 페이지에 대한 신뢰 수준을 낮 춥니 다 (IE는이 “타사”컨텐츠를 호출합니다). IFRAME 내부의 페이지에 개인 정보 보호 정책이없는 경우 쿠키가 차단됩니다 (클릭하면 상태 표시 줄에 눈 아이콘으로 표시됨). 차단 된 URL 목록이 표시됩니다.

사악한 눈
(출처 : piskvor.org )

이 경우 쿠키가 차단되면 세션 식별자가 전송되지 않고 대상 스크립트에서 ‘세션을 찾을 수 없음’오류가 발생합니다.

(세션 식별자를 양식으로 설정하고 POST 변수에서로드하려고 시도했습니다. 이것은 효과 가 있었지만 정치적 이유로는 그렇게 할 수 없었습니다.)

IFRAME 내부의 페이지를보다 신뢰할 수있게 만들 수 있습니다. 내부 페이지가 IE에 허용되는 개인 정보 보호 정책으로 P3P 헤더를 보내면 쿠키가 허용 됩니다.

그것을 해결하는 방법

p3p 정책 만들기

좋은 출발점은 W3C 튜토리얼 입니다. 이를 통해 IBM 개인 정보 보호 정책 편집기를 다운로드 한 후 개인 정보 보호 정책 의 표현을 작성하고이를 참조 할 이름을 지정했습니다 (여기서는 policy1).

참고 :이 시점에서 실제로 사이트에 개인 정보 보호 정책이 있는지 확인하고 그렇지 않은 경우 사이트를 생성해야합니다. 사용자 데이터 수집 여부, 데이터 종류, 사이트 기능, 액세스 권한, 이 정보를 찾아서 생각 해야합니다. 몇 개의 태그를 함께 두드리면 잘리지 않습니다. 이 단계는 소프트웨어로만 수행 할 수 없으며 매우 정치적 일 수 있습니다 (예 : “클릭 통계를 판매해야합니까?”).

(예 : “사이트는 ACME Ltd.에서 운영하며 운영에 익명 세션 당 식별자를 사용하고 명시 적으로 허용 된 경우에만 사용자 데이터를 수집하며 다음 목적을 위해서만 데이터를 필요한 경우에만 당사 회사 만 저장합니다. 등에 액세스 할 수 있습니다. “).

이 도구를 사용하여 편집 할 때 정책에서 오류 / 생략을 볼 수 있습니다. “HTML 정책”탭도 매우 유용합니다. 맨 아래에는 “정책 평가”가 있습니다. 정책이 차단되는지 빠르게 확인합니다. IE의 기본 설정에 따라)

Editor는 위 정책의 XML 표현 인 .p3p 파일로 내 보냅니다. 또한이 정책의 “컴팩트 버전”을 내보낼 수 있습니다.

정책에 연결

그런 다음 정책 참조 파일 ( 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) 프레임을 사용하여 다른 웹 사이트에로드되지 않는 한. 이것은 IE가 ***에서 큰 고통이되는 곳입니다. P3P 헤더가 설정되어 있지 않으면 쿠키를 설정할 수 없습니다.

이것을 알고 다음 두 가지 질문에 대한 답을 찾고 싶었습니다.

  1. 무슨 상관이야? 다시 말해, 헤더에 “Potato”라는 단어를 넣으면 고소 될 수 있습니까?
  2. 다른 회사는 무엇을합니까?

나의 발견은 :

  1. 아무도 신경 쓰지 않는다. 이 기술에 법적 가중치가 있음을 나타내는 단일 문서를 찾을 수 없습니다. 연구하는 동안 P3P 헤더에 “Potato”라는 단어를 넣지 못하게하는 법을 채택한 전 세계 단일 국가를 찾지 못했습니다.
  2. 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를 눌러 사이트를 다시로드해야합니다. 그렇지 않으면 탐색기가 제대로 작동하더라도 악의적 인 눈이 보일 수 있습니다. 이것이 아마도 작동하는데 많은 문제가 있었던 주된 이유 일 것입니다.

정책 파일이 전혀 필요하지 않았습니다.

편집 : IFrames의 쿠키 문제를 설명하는 멋진 블로그 항목을 찾았습니다. 또한 C # 코드에서 프레임, ASPX 페이지 및 거부 된 쿠키에 대한 빠른 수정 사항이 있습니다.


답변

이것은 다른 답변의 의견에 묻혀 있지만 거의 놓쳤으므로 자체 답변이 필요한 것처럼 보입니다.

검토하려면 : IE가 타사 쿠키를 허용하려면 다음 형식의 p3p라는 http 헤더를 사용하여 파일을 제공해야합니다.

CP="my compact p3p policy"

그러나 p3p는 현재 표준으로 거의 죽었으므로 실제 p3p 정책을 만드는 데 시간과 법적 자원을 투자하지 않고도 IE가 쉽게 작동하도록 할 수 있습니다. 컴팩트 p3p 정책 헤더가 유효하지 않은 경우 IE는 실제로이를 양호한 정책으로 취급하고 타사 쿠키를 허용하기 때문입니다. 따라서 다음과 같은 p3p 헤더를 사용할 수 있습니다

CP="This site does not have a p3p policy."

Google 및 Facebook과 마찬가지로 p3p 정책이없는 이유를 설명하는 페이지 링크를 선택적으로 포함 할 수 있습니다 ( https://support.google.com/accounts/answer/151657 및 여기 : https). http://www.facebook.com/help/327993273962160/ ).

마지막으로, 타사 사이트에서 제공되는 모든 파일에는 쿠키를 설정하는 것이 아니라 p3p 헤더가 있어야하므로 PHP, asp.net 등에서이 작업을 수행하지 못할 수도 있습니다. 암호. 웹 서버 수준 (IIS 또는 Apache)에서 설정하는 것이 좋습니다.


답변

이 문제도 있었으며 MVC2 프로젝트에서 사용한 코드를 게시한다고 생각했습니다. 페이지 수명주기에서 헤더에 추가하거나 HttpException ” HTTP 헤더가 전송 된 후 서버가 헤더를 추가 할 수 없습니다 “가 표시 될 때주의하십시오 . OnActionExecuting 메서드에서 사용자 지정 ActionFilterAttribute를 사용했습니다 (작업이 실행되기 전에 호출 됨).

/// <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 라인이 있어야한다는 것을 알았습니다. Javascript 파일 또는 이미지와 같은 쿠키를 설정하거나 사용하지 않는 파일까지도 타사 서버에서 전송 된 모든 파일의 헤더로 전달됩니다 . 그렇지 않으면 쿠키가 차단됩니다. 나는 여기에 게시물에 이것을 더 가지고 있습니다 : http://posheika.net/?p=110


답변

node.js 에서이 문제가있는 사람.

그런 다음이 p3p 모듈을 추가하고 미들웨어에서이 모듈을 사용하십시오.

npm install p3p

Express를 사용하고 있으므로 app.js에 추가합니다.

먼저 app.js에서 해당 모듈이 필요합니다.

var express = require('express');
var app = express();
var p3p = require('p3p');

그런 다음 미들웨어로 사용하십시오.

app.use(p3p(p3p.recommended));

res 객체에 p3p 헤더를 추가합니다. 추가 작업이 필요 없습니다.

당신은 더 많은 정보를 얻을 것이다 :

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