之前写过一篇文章,关于如何判断用户是否登录第三方网站。
文章主要讲述了,如何构建一个黄色网站,并采集用户信息。用的技术是jsonp,如果用户登陆了微博、人人网等社交账号,并用相同浏览器访问了这个黄色网站,那么网站就会记录下用户的微博、人人等信息。进行精准定位,甚至推销服务。
具体可参见:利用jsonp原理精准定位约炮需求用户
这个功能本身看上去并无大用,不过我们可以当做一个研究方向,在研究的过程中,可以加深我们对业务的理解、浏览器以及js的深入。本片文章,会从另一个思路入手,讲解如何构建一个网站,并感知用户是否登录第三方网站。
作为研究课题,我在部门的周会上提出了这个问题————“自己编写一个网页(域名也是自己的),用户一旦访问这个网页,就告诉用户他当前是否登陆了微博账号”。题目的为期时间一周,虽然最终没有同学找到答案,但是这个过程也比较有意思:
1. 有同学从ajax入手,思考是否有解决方案。
2. 有同学从iframe考虑,嵌入到自己网页,尝试突破。
3. 还有同学发现了重定向功能,寻找可行途径。
4. 等等
虽然都失败了,但是大家发现失败的原因无非就是:
1. 浏览器跨域问题
2. 微博网站做域名白名单限制
说到跨域,就不得不说浏览器同源策略,我发现很多人对浏览器同源策略并不是很清楚,所以也就导致有同学思考问题上来就跑偏了,一直围绕着“如何绕过同源策略”来思考,当然得不到答案。
那么,什么是同源策略?
同源策略是为了保证用户信息的安全,防止恶意的网站窃取数据。设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。由此可见,"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。
同源策略三要素:
1. 协议相同
2. 域名相同
3. 端口相同
同源策略限制范围:
1. Cookie、LocalStorage 和 IndexDB 无法读取。
2. DOM 无法获得。
3. AJAX 请求不能发送。
这里,总结下可能的方法,以及方法行不通的原因:
1. GET/PUT获取微博数据————页面会跳转,不受原始网页控制。
2. ajax发请求给微博接口————同源策略ajax限制。
3. 网页插入一个iframe指向微博,读取iframe信息————同源策略dom无法获得。
4. 通过微博重定向功能,重定向到攻击者网页————微博做了域名白名单限制。
5. 通过jsonp接口获取————理论可行,但是没有找到jsonp接口。
其他的方法就不一一列举了,我们注意下第5点,为什么jsonp理论可行呢,因为jsonp其实就是js,而js是不受同源策略限制的!
想通了么?这个问题的思考方向就是:
列举所有同源策略不受限制的资源,从这里入手。
在浏览器中,script、img、iframe、link等标签都可以加载跨域资源,而不受同源限制,但浏览器限制了JavaScript的权限使其不能读、写加载的内容。另外同源策略只对网页的HTML文档做了限制,对加载的其他静态资源如javascript、css、图片等仍然认为属于同源。
注意图片!注意上面提到的重定向!我们能不能二者结合呢?答案是肯定的。
大部分网站都支持重定向:
facebook,https://www.facebook.com/login.php?next=***
微博,weibo.com/login.php?url=***
由于做了白名单限制,***只能填写特定的网址,比如微博的url只支持*.weibo.com域名。
大部分网站图片都放在cdn上面,域名也不会采用网站域名,而是一个cdn域名。但是有一张极为特殊的图片:
http://weibo.com/favicon.ico
答案出来了:
weibo.com/login.php?url=http://weibo.com/favicon.ico
登录时,这个网址会302到ico图片,未登录时,会展示登陆页。
直接上html代码:
本文参考:
http://www.freebuf.com/vuls/120049.html
http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html
Leave a Reply