为什么iframe请求不发送cookie?

Jer*_*nch 11 security iframe google-chrome cross-domain content-security-policy

兄弟部门创建了一个HTML文件,它实际上是少数iframe的支架.每个iframe调用一个报告,该报告托管在Web服务器上,参数略有不同.被叫报告将向未经身份验证的用户显示登录表单,或向已经过身份验证的用户显示报告内容.

scaffold.html:

<html>
   <head>
      <title>I just show the output from a bunch of report calls</title>
   </head>
   <body>
      <iframe src="https://somesite.com/useful_report.html?parameter1=a&parameter2=1" id="iframe1"></iframe>
      <iframe src="https://somesite.com/useful_report.html?parameter1=b&parameter2=2" id="iframe2"></iframe>
      <iframe src="https://somesite.com/useful_report.html?parameter1=c&parameter2=3" id="iframe3"></iframe>
      <iframe src="https://somesite.com/useful_report.html?parameter1=d&parameter2=4" id="iframe4"></iframe>
   </body>
</html>
Run Code Online (Sandbox Code Playgroud)

兄弟组织向我们解释说,如果用户登录https://somesite.com,上述设置工作得很好 - 每个iframe都会显示有用的内容...直到几天前.

当我

  1. 登录https://somesite.com,然后
  2. 将文件:/// C:/Users/me/Desktop/scaffold.html加载到Chrome中

每个iframe都会在表单上返回https://somesite.com标志.如果我然后在单独的选项卡中打开useful_report.html,则会加载报告内容(证明somesite.com知道我仍然登录‡).

使用开发人员工具,我可以看到util_report.html的请求标头不包含"Cookie:"属性,因此这解释了为什么useful_report.html返回表单上的登录.

我的问题是为什么iframe请求不发送cookie?什么Chrome和/或服务器设置/策略/指令阻止了它?

‡ - 现在知道我知道它知道了.

小智 8

这是因为Chrome 默认为 LaxSameSite cookie 策略,这意味着除非用户可以看到排除 iframe 的 URL,否则不会发送 cookie。

如果您拥有somesite.com,您可以通过将 SameSite 策略设置为 None 来选择退出此策略,并通过执行Double Submit Cookie来应对 CSRF 攻击的风险。