我在一家电子商务网站工作。我们所做的部分工作是为一些客户提供定制项目。最近,一些非技术管理人员承诺,我们可以将我们的结账流程整合到一个这样的客户网站中。我们弄清楚如何做到这一点的唯一方法是使用 iframe(我知道,我也不喜欢它)。问题是该站点的大多数客户无法结帐,因为我们使用 cookie 来确定要显示的自定义项目。浏览器将我们的 cookie 识别为第三方,几乎每个人都应关闭第三方 cookie。如果答案是肯定的,我会感到震惊,但是有什么解决方法吗?即托管我们的 iframe 的网站能否以某种方式提供必要的 cookie?
5 回答
尝试一个不可见的插页式页面。
本质上,托管站点会重定向到您域内的站点,然后可以自由设置 cookie(因为此时实际上是第一方)。然后您的网站会立即重定向回托管网站。此时,您新创建的 cookie 将对托管站点不可见,但此后对您的 iFramed 页面可见。
不幸的是,每次更新 cookie 时托管站点都必须这样做,但双重重定向可能发生得如此之快,他们几乎不会注意到。希望您的系统只需要设置一次 cookie。
不使用 cookie,而是将每个 url 请求中的信息作为名称/值对传递。
将名称/值添加到每个 url 有点痛苦……我知道……哦,好吧……它会起作用的。
插页式页面解决方案应该可以工作,但它可能会给您的托管站点带来很多麻烦,所以这里有另一个解决方案可以让您在无 cookie 的情况下工作。
编写一个响应BeginRequest事件的HttpModule,读取查询字符串,将对应的cookie头插入到Context.HttpRequest对象中(注意:不能使用AddCookie,必须使用AddHeader,因为模块直接添加的cookie会被释放在他们正确地访问您的应用程序之前)。这样,托管站点可以简单地发出一个请求(在 iFrame 内),其中包含查询字符串中的必要值,模块会将其转换为 cookie(仅存在于内存中,而不存在于网络上),您的应用程序将被骗以为那里有饼干。无需更改代码,只需在 web.config 中添加模块即可。
这仅适用于在集成管道模式下使用 IIS 7.0+ 的情况。如果您使用的是早期版本的 IIS,或者您必须在经典模式下运行,则需要一个 ISAPI 筛选器。
如果答案是肯定的,我会感到震惊,但是有什么解决方法吗?即托管我们的 iframe 的网站能否以某种方式提供必要的 cookie?
您的 iframed 页面本身(在这种情况下是第三方)可以发送 P3P Cookie 策略标头 - 一些浏览器默认接受第三方 cookie,而其他浏览器(主要是 Safari)如果不接受则根本不会被说服这样做由用户自己操作默认设置。
您还可以做的,不是(仅)通过 cookie 传递会话 id,而是作为 GET 或 POST 参数传递——在 PHP 下,这可以通过配置会话选项很容易地完成。您应该考虑是否值得稍微增加会话窃取的风险。
Ryan , John 对于带有 SameSite 标志的 Chrome v80 更新,希望为托管 iframe 的站点设置 samesite=none;secure 并以某种方式提供必要的 samesite=none;secure cookie。我们有 apache 2.2 和 tomcat 6 设置,因此希望能提供解决方案和有关如何使其工作的建议。当前启用标志后,iFrame 未成功打孔。谢谢