前言
同源政策:起源被定义为URI方案,主机名和端口号的组合。此策略可防止一个页面上的恶意脚本通过该页面的文档对象模型访问另一个网页上的敏感数据。
由于服务器基于HTTP cookie信息来揭示敏感信息或采取改变状态的行为,因此这种机制对于广泛依赖于HTTP cookie 的现代Web应用程序来维护经过验证的用户会话具有特殊意义。(维基百科)
(一)慨念
所谓的同源指的是“三个相同”
- (1)协议相同
- (2)域名相同
- (3)端口相同
举个例子来说
(二)安全应用程序
同源策略的概念可以追溯到1995年的Netscape Navigator 2。该策略最初设计用于保护对文档对象模型的访问,但后来扩展为保护全局JavaScript对象的敏感部分。
同源策略有助于保护使用经过验证会话的网站。
假设一种情况:A网站是一家银行,用户登陆以后,又去浏览其他网站,该网站在后台运行一些恶意JavaScript代码,该代码从银行网站请求数据。由于用户仍然登录到银行网站,因此恶意代码可以做任何用户在银行网站上可以执行的操作。
(三) 限制范围
随着互联网的发展,”同源政策”越来越严格。目前,如果非同源,共有三种行为受到限制。
(1) Cookie、LocalStorage 和 IndexDB 无法读取。
(2) DOM 无法获得。
(3) AJAX 请求不能发送。
(四)放宽同源政策
在某些情况下,同源策略的限制性过大,会对使用多个子域的大型网站造成问题。
目前有以下几种解决方案
- document.domain属性
- 跨源资源共享
- 跨文档消息传递
- JSONP
- WebSockets
(1)domain属性(iframe)
举例来说,A网页是http://v1.example.com/a.html,B网页是http://v2.example.com/b.html,那么只要设置相同的document.domain,两个网页就可以共享Cookie,以及iframe窗口和window.open方法打开的窗口,而LocalStorage 和 IndexDB 无法通过这种方法。
(2)pjax
单页SPA的实现原理目前有两种方式:
- window(onhashchange)
- window(onpopstate)
他们都可以通过改变片段标识符,页面不会重新刷新。
首先我们来看hash更改
举个例子
<!DOCTYPE html>
<html lang="en">