上有政策 - 同源政策

为什麽要有同源政策?/images/emoticon/emoticon19.gif

可以先想想没有同源政策会发生什麽事?

当你在看这篇文章时,可以看看你的浏览器开了多少分页,可能开了 gmail 信箱的页面,脸书,无数部落格等等,这时候这些网站间便可以读取其他网站的资讯,如果这时候某个网页要读取你个人信箱的私人讯息也是可以的,这时你可能会想,这样许多私人的资讯不就会被窃取吗?

没错,正是为了避免恶意的脚本透过 DOM 存取资料,同源政策规定了只有来源相同的文件可以彼此存取资源。

那怎麽样才算是同源呢?

我们先来看看访问一个网页时一定会需要的网址,一个网址可以大致分成四个部分:

http://www.example.com/dir/page.html

  1. 协定 - http
  2. 网域 - www.example.com
  3. 埠号 - 没有标明的话预设是80
  4. 路径 - dir/page.html

只要前三个相同就算是同源,以下可以比较一下哪些网址和上述的网址同源


图片来源:维基百科

虽然同源的网站才能彼此存取资料,但不代表完全禁止跨来源存取资料,这是很大的一个迷思。MDN 提到两个允许的特定情况:

1. 跨来源写入

  • 表单送出
  • 连结
  • 重新导向

2. 跨来源嵌入

  • 图片
  • 使用HTML标签 <video><audio>嵌入的影音媒体
  • @font-face 的字型(部分浏览器不允许)
  • iframes(如果 X-Frame-Options 的设定是 sameorigin 或 deny 则不允许嵌入)
  • script(对於特定的API存取可能会被禁止)

放宽同源政策的两大策略

由於不是所有网站都带有恶意程序,加上网页间有时必须取用第三方资源,所以有两种方式可以让网页存取不同来源的资源:

  1. 将指令稿 document.domain 设为文件後缀,不过因为安全性因素,MDN 上提到这种方式已被弃用

  1. 使用跨来源资源共享( Cross-Origin Resource Sharing,简称 CORS )
    • 透过设定 Access-Control-Allow-Origin发送请求的网址*,即可取得其他来源的资源

至於跨域请求会发生的错误以及 CORS 的详细做法,就待之後再理解了~

参考资料:
MDN
Same-origin policy


<<:  Day 22 Todo list

>>:  追求JS小姊姊系列 Day21 -- 工具人、姐妹不只身份的差别(上): 基本型别包裹器(wrapper object)

[Day17] Cloud Run

Cloud Run 是这次要介绍的最後一种部属服务方式。它是一种基於 Container 的 Ser...

[Day2] What is Pentest

渗透测试简介 今天来跟各位介绍一下,什麽是渗透测试。渗透测试(Penetration Test),简...

Day 17 「提枪上阵」在测试保护下重构出 State 设计模式

报告班长,图片截自网路 大家有听过「报告班长」吗?这部 1987 年的电影,当年推出後一炮而红,带...

Day27 - GitLab CI 如何让工作流程流水线跑快一点?之一 从 .gitlab-ci.yml 大部分解

在专案过程中,透过 GitLab CI 建立流水线,让研发过程中如编译、测试、打包、部署等工作都得以...

Day27. Blue Prism进化中的宝可梦–BP增加稳定与弹性的调校

有一阵子流行的宝可梦Go的App寻宝游戏, 吸引不少粉丝信徒的膜拜, 玩家们都希望自己手上的宝可梦能...