看到一篇《浅谈WAP网站安全》的文章。里面讲到通过URL的referer获取用户的登录session。
简单描述一下:
例如有个WAP页面: http://abc.com/link.php?sid=xxxxxx,sid为用户登录后的session ID,页面中有链接到http://efg.com的A标签。
当用户点击链接访问http://efg.com时,efg.com的服务器log里就会有类似
xxx.xxx.xxx.xxx – - [17/Jan/2011:13:29:14 +0800] “GET / HTTP/1.0″ 302 20 “http://abc.com/link.php?sid=xxxxxx” “Firefox”
的记录,无疑efg.com就可以得到该用户的在abc.com的登录session
疑问:abc.com傻b吗?不会把sid存到cookie里吗?
全是中国移动的错,虽然现在几乎所有的手机浏览器都支持cookie,但是如果用户通过CMWAP连接上网,浏览器cookie会被网关过滤。所以国内的WAP网站一般会采取URL参数的形式在页面间传递session id;(那二般是什么?二般是CMWAP网关直接把用户的手机号告诉你,当然这中间必然有某些利益)
那么解决方法就是:
1. 不要在这个外链页面加sid,但是显然不可能,sid丢失之后这个用户就相当于登出了
2. 想办法跳转时不带referer
我们只能选方法2,页面跳转有三种方式:
1. 302/301跳转
header('location: http://xxx');
2. meta标签跳转
<meta http-equiv="refresh" content="2;url=http://xxxx" />
3. javascript跳转
document.location = 'http://xxxx';
第三种方法,通过JS跳转对于WAP网站来说显然是不靠谱的。所以我只测试了前面两种方法:
test.php -> test2.php -> test3.php
test.php有一个A标签连接到test2.php,test2.php通过302或meta标签的方式跳转到test3.php
然后分析server log,得到下面的referer字段分析表;
点击页URL = test.php
跳转页URL = test2.php
| Location跳转 | Meta跳转 | |
|---|---|---|
| UCWEB(S60) | 跳转页URL | 无 |
| UCWEB(Anriod) | 点击页URL | 无 |
| Opera(S60) | 点击页URL | 跳转页URL |
| S60自带浏览器 | 点击页URL | 跳转页URL |
| Anriod自带浏览器 | 点击页URL | 跳转页URL |
结果表明302跳转显然是不靠谱的,对于meta跳转,有的浏览器干脆不传referer,要么直传了跳转页的URL,所以使用meta跳转的方式现在看来还是安全的
为啥说现在看来是安全的:
1 . 因为一个浏览器通过跳转不传referer貌似被认为是不规矩的,看这里http://www.w3help.org/zh-cn/causes/CH9004
2 . 手机浏览器五花八门,我的测试不充分
———–
post by gmail~