Cookie blocked/not saved in IFRAME in Internet Explorer

前端 未结 22 2083
死守一世寂寞
死守一世寂寞 2020-11-22 00:53

I have two websites, let\'s say they\'re example.com and anotherexample.net. On anotherexample.net/page.html, I have an IFRAME S

相关标签:
22条回答
  • 2020-11-22 01:20

    I got it to work, but the solution is a bit complex, so bear with me.

    What's happening

    As it is, Internet Explorer gives lower level of trust to IFRAME pages (IE calls this "third-party" content). If the page inside the IFRAME doesn't have a Privacy Policy, its cookies are blocked (which is indicated by the eye icon in status bar, when you click on it, it shows you a list of blocked URLs).


    (source: piskvor.org)

    In this case, when cookies are blocked, session identifier is not sent, and the target script throws a 'session not found' error.

    (I've tried setting the session identifier into the form and loading it from POST variables. This would have worked, but for political reasons I couldn't do that.)

    It is possible to make the page inside the IFRAME more trusted: if the inner page sends a P3P header with a privacy policy that is acceptable to IE, the cookies will be accepted.

    How to solve it

    Create a p3p policy

    A good starting point is the W3C tutorial. I've gone through it, downloaded the IBM Privacy Policy Editor and there I created a representation of the privacy policy and gave it a name to reference it by (here it was policy1).

    NOTE: at this point, you actually need to find out if your site has a privacy policy, and if not, create it - whether it collects user data, what kind of data, what it does with it, who has access to it, etc. You need to find this information and think about it. Just slapping together a few tags will not cut it. This step cannot be done purely in software, and may be highly political (e.g. "should we sell our click statistics?").

    (e.g. "the site is operated by ACME Ltd., it uses anonymous per-session identifiers for its operation, collects user data only if explicitly permitted and only for the following purposes, the data is stored only as long as necessary, only our company has access to it, etc. etc.").

    (When editing with this tool, it's possible to view errors/omissions in the policy. Also very useful is the tab "HTML Policy": at the bottom, it has a "Policy Evaluation" - a quick check if the policy will be blocked by IE's default settings)

    The Editor exports to a .p3p file, which is an XML representation of the above policy. Also, it can export a "compact version" of this policy.

    Link to the policy

    Then a Policy Reference file (http://example.com/w3c/p3p.xml) was needed (an index of privacy policies the site uses):

    <META>
      <POLICY-REFERENCES>
        <POLICY-REF about="/w3c/example-com.p3p#policy1">
          <INCLUDE>/</INCLUDE>
          <COOKIE-INCLUDE/>
        </POLICY-REF>
      </POLICY-REFERENCES>
    </META>
    

    The <INCLUDE> shows all URIs that will use this policy (in my case, the whole site). The policy file I've exported from the Editor was uploaded to http://example.com/w3c/example-com.p3p

    Send the compact header with responses

    I've set the webserver at example.com to send the compact header with responses, like this:

    HTTP/1.1 200 OK 
    P3P: policyref="/w3c/p3p.xml", CP="IDC DSP COR IVAi IVDi OUR TST"
    // ... other headers and content
    

    policyref is a relative URI to the Policy Reference file (which in turn references the privacy policies), CP is the compact policy representation. Note that the combination of P3P headers in the example may not be applicable on your specific website; your P3P headers MUST truthfully represent your own privacy policy!

    Profit!

    In this configuration, the Evil Eye does not appear, the cookies are saved even in the IFRAME, and the application works.

    Edit: What NOT to do, unless you like defending from lawsuits

    Several people have suggested "just slap some tags into your P3P header, until the Evil Eye gives up".

    The tags are not only a bunch of bits, they have real world meanings, and their use gives you real world responsibilities!

    For example, pretending that you never collect user data might make the browser happy, but if you actually collect user data, the P3P is conflicting with reality. Plain and simple, you are purposefully lying to your users, and that might be criminal behavior in some countries. As in, "go to jail, do not collect $200".

    A few examples (see p3pwriter for the full set of tags):

    • NOI : "Web Site does not collected identified data." (as soon as there's any customization, a login, or any data collection (***** Analytics, anyone?), you must acknowledge it in your P3P)
    • STP: Information is retained to meet the stated purpose. This requires information to be discarded at the earliest time possible. Sites MUST have a retention policy that establishes a destruction time table. The retention policy MUST be included in or linked from the site's human-readable privacy policy." (so if you send STP but don't have a retention policy, you may be committing fraud. How cool is that? Not at all.)

    I'm not a lawyer, but I'm not willing to go to court to see if the P3P header is really legally binding or if you can promise your users anything without actually willing to honor your promises.

    0 讨论(0)
  • 2020-11-22 01:22

    Got similar problem, also went to investigate how to generate the P3P policy this morning, here is my post about how to generate your own policy and use in the web site :) http://everydayopenslikeaflower.blogspot.com/2009/08/how-to-create-p3p-policy-and-implement.html

    0 讨论(0)
  • 2020-11-22 01:23

    I've implemented a full P3P policy before but didn't want go through the hassle again for a new project I was working on. I found this link useful for a simple solution to the problem, only having to specify a minimal compact P3P policy of "CAO PSA OUR":

    http://blog.sweetxml.org/2007/10/minimal-p3p-compact-policy-suggestion.html

    The article quotes a (now broken) link to a Microsoft kb article. The policy did the trick for me!

    0 讨论(0)
  • 2020-11-22 01:23

    In Rails 3.2 I am using:

    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  
    

    I got this from: http://dot-net-web-developer-bristol.blogspot.com/2012/04/setting-p3p-header-in-rails-session.html

    0 讨论(0)
提交回复
热议问题