chrome
的安全策略:可用于跨域
关闭 对于 Linux
,终端执行: google-chrome --disable-web-security --user-data-dir=<path to store the data>
。
如
google-chrome --disable-web-security --user-data-dir=/home/xu/test-dir
- 其中
--disable-web-security
选项关闭web
的一些安全策略【其中包括阻止不合法的跨域请求】。 - 在
Linux
下,如果要关闭安全策略,则必须指定一个目录user-data-dir
用于保存这样运行浏览器所产生的一些数据
使用场景
前后端分离开发时
- 前端运行在
http://localhost:8080
- 后端运行在
http://localhost:8000
这时前端对后端发起请求属于跨域了(只要协议、域名、端口有任何一个的不同,就被当作是跨域——不同域),正式上线网站的时候一般都会把前后端放到一个域里,比如将前端打包成静态资源后使用 nginx
进行部署或者直接由和后台代码放在一起。
限制跨域访问是浏览器的安全策略,主要有两种:
DOM
同源策略:禁止对不同源页面DOM
进行操作。这里主要场景是iframe
跨域的情况,不同域的iframe
是限制互相访问的。XMLHttpRequest
同源策略:禁止使用XHR
对象向不同域发起HTTP
请求。
为什么浏览器要这样做?
当然是为了安全啊
我们假设有两个域:
- 域1:存着你血汗钱的网站:
http://money.com
- 域:一个恶意网站:
http://坏人.com
为了方便在客户端存储少量信息,浏览器推出了 cookie
这样的功能。
即浏览器每次发起
http
请求,浏览器都会自动带上这个域的cookie
, 比如访问http://money.com
的主页,浏览器则会自动帮你带上http://money.com
这个域的cookie
这样可以很方便的使得 http://money.com
的后台程序根据 cookie
所携带的信息来改善用户的使用体验,最常用的就是以此来识别用户,使用户保持登录状态。但是这样有一个副作用:
即使你是在其它域通过
XMLHttpRequest
对象发起这个http
请求,也同样是带上money.com
这个域的cookie
。这就给坏人带来了机会
试想这样一个场景:
你刚登录了 http://money.com
这个网站,验证信息保存在 cookie
里,而且还没有过期。然后你又进入了 http://坏人.com
这个网站,坏人网站载入的时候就在后台用 XMLHttpRequest
对象向 http://money.com
发请求。如果浏览器不管不顾,直接就允许了,那这个请求就带着 cookie
发出去了,服务端一看 cookie
里的验证信息,是 OK
的。坏人不就得到服务器返回的信息了么,然后他就拿着你的信息做坏事了,好可怕。
实际上呢,以 google-chrome
为例(google-chrome
默认打开了相关的安全策略):
- 如果服务端允许任何其它域来请求:则允许这个请求,然后坏人就得逞了。
- 如果服务端只允许指定的域来请求:发现这个请求来自于
http://坏人.com
域,不在设定的许可名单里,则不会允许这个陌生的请求
当我们关闭了
google-chrome
的安全策略的时候,这个请求直接就发出去了,根本不管服务端允许不允许的。这是怎么实现的呢,请求里不带发送域或者是直接将发送域替换成目的域吗?