Chrome的同源

CodeLavenderR
• 阅读 3260

好久不见。


又来了

  • 好久好久好久不见。
  • 但有时候我想想,人还是得学习。
  • 坚持真的是个有益的能力。

同源策略(主讲Chrome 91的坑)

简要介绍

  1. 同源(same-origin):那就是常见的三个元素,协议,主机名,端口(scheme, hostname, port)都得一样。
  2. 同站(same-site):有效的顶级域名+顶级域名前的部分,都得一样。

Same Origin

Chrome的同源

上图中的 scheme, hose name, port 都相同则为 same origin ,否则为 cross origin

Origin A(相同的例子)Origin BExplanation of whether Origin A and B are "same-origin" or "cross-origin"
https://www.example.com:443https://www.evil.com:443cross-origin: different domains
https://www.example.com:443https://example.com:443cross-origin: different subdomains
https://www.example.com:443https://login.example.com:443cross-origin: different subdomains
https://www.example.com:443http://www.example.com:443cross-origin: different schemes
https://www.example.com:443https://www.example.com:80cross-origin: different ports
https://www.example.com:443https://www.example.com:443same-origin: exact match
https://www.example.com:443https://www.example.comsame-origin: implicit port number (443) matches

Same Site

Chrome的同源

上图中的 eTLD+1 相同则为 same site ,否则为 cross site

Origin A(相同的例子)Origin BExplanation of whether Origin A and B are "same-site" or "cross-site"
https://www.example.com:443https://www.evil.com:443cross-site: different domains
https://www.example.com:443https://login.example.com:443same-site: different subdomains don't matter
https://www.example.com:443http://www.example.com:443same-site: different schemes don't matter
https://www.example.com:443https://www.example.com:80same-site: different ports don't matter
https://www.example.com:443https://www.example.com:443same-site: exact match
https://www.example.com:443https://www.example.comsame-site: ports don't matter

Schemeful Same Site

Chrome的同源

上图中的 scheme, eTLD+1 都相同则为 schemeful same site ,否则为 cross site

Origin A(相同的例子)Origin BExplanation of whether Origin A and B are "same-site" or "cross-site"
https://www.example.com:443https://www.evil.com:443cross-site: different domains
https://www.example.com:443https://login.example.com:443schemeful same-site: different subdomains don't matter
https://www.example.com:443http://www.example.com:443cross-site: different schemes
https://www.example.com:443https://www.example.com:80schemeful same-site: different ports don't matter
https://www.example.com:443https://www.example.com:443schemeful same-site: exact match
https://www.example.com:443https://www.example.comschemeful same-site: ports don't matter

如何查看

Chrome 的 Network 面板中查看 http 请求头中的 Sec-Fetch-Site 字段值。
该字段的值有四个:

  • cross-site
  • same-site
  • same-origin
  • none

其中命中了 cross-site 和 cross-origin,则命中 Chrome 的同源同站策略,Chrome 会做出认为安全的访问限制,比如 Cookie 是带不过去了。

解决方案

  1. 就只能全部同源同站,这样页面和接口请求永远安全。
  2. 登录态的方案不采用 Cookie,采用 Token 或者其他安全方案。
  3. 同事还提供了一个方案,nginx 配置代理后端接口请求,统一走页面域名。

我真的是被 Chrome 一直吊打,80版本的时候就不放过我,91版本依然有老项目命中。
我一直也是 get 不到这个限制的意义,因为我觉得随便在headers约定一个字段就越过了这个限制,但有的同事解释说主要是为了防止第三方,比如统计工具之类的,并不是防我。。。

我的 case 稍微有点复杂,简单描述一下,提供使用。公司的老项目,不似现在的脚手架可以做请求代理,但是部署到环境上的页面和接口请求又是同站的,所以只需要解决本地开发问题。

  1. 页面和接口请求都在 host 配置同站的域名
  2. 同为 http 请求不会命中 Schemeful Same Site,那如果命中了,就在 chrome配置 中禁用 Schemeful Same-Site 选项,重启即可。

以上是91版本的坑。80之后91之前的版本,是没有这么严格的,可以在 chrome://flags/ 中禁用 same-site-by-default-cookies 及 cookies-without-same-site-must-be-secure 即可。但这些禁用也仅限开发者使用,非长久之计。

没了,还想再记录一下跨域的问题。虽然都是很常见的问题。


参考


好记性不如烂笔头。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
芝士年糕 芝士年糕
3年前
什么是跨域
域: 是指浏览器不能执行其他网站的脚本跨域: 它是由浏览器的 同源策略 造成的,是浏览器对 JavaScript 实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol,主机 host 和端口号 port 则就会造成 
专注IP定位 专注IP定位
4年前
浅析九种跨域方式实现原理
我们在解决一个问题的时候应该先去了解这个问题是如何产生的,为什么会有跨域的存在呢?其实,最终的罪魁祸首都是浏览器的同源策略,浏览器的同源策略限制我们只能在相同的协议、IP地址、端口号相同,如果有任何一个不通,都不能相互的获取数据。并且,http和https之间也存在跨域,因为https一般采用的是443端口,http采用的是80端口或者其他。同源策略是一种约
Stella981 Stella981
4年前
Https请求的页面中无法使用http访问
今天遇到一个问题,使用https访问的页面,其间发起http的ajax的请求都被浏览器拒绝,必须为https,否则无法请求,导致页面局部未初始化。浏览器报错Thisrequesthasbeenblocked;thecontentmustbeservedoverHTTPS.百度了下,了解到同源策略。所谓“同源”指的是:协议相同、域名相
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
4年前
35道面向初中级前端的基础面试题
如需获取完整版229页PDF面试题,请直接滑到文末。1\.什么是同源策略?同源策略可防止JavaScript发起跨域请求。源被定义为协议、主机名和端口号的组合。此策略可防止页面上的恶意脚本通过该页面的文档对象模型,访问另一个网页上的敏感数据。参考资料:浏览器的同源策略(https://www.oschina.
liam liam
2年前
解决 Axios 跨域阻碍,提高前端接口访问效率
跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用XMLHttpRequest和Fetch请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对施加的安全限制。Axios跨域常见报错跨域请求被阻止(CrossOriginRe
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
ZOS对象存储跨域资源访问的实现和使用
跨域指的是从一个域名去请求另外一个域名的资源,即跨域名请求。跨域时,浏览器不能执行其他域名网站的脚本,这是由浏览器的同源策略造成的,是浏览器施加的安全限制。同源策略是一种约定,是浏览器最核心也最基本的安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这是一个用于隔离潜在恶意文件的重要安全机制。