发现一个蛮不安全的跨域jsonp操作,来问问原理。

2013-02-06 22:53:33 +08:00
 friskfly
我也不知道这个问题是不是菜鸟问题,v2ex上大神比较多,我就跑这里来问了。
最近用美味书签收藏网页,用起来蛮爽,解决了Chrome书签难管理的问题。
一直以来都是点一下书签栏中的“收藏到美味书签的” js脚本来收藏书签。今天读hackernews的时候碰到一个网站 http://val.markovic.io/blog/youcompleteme-a-fast-as-you-type-fuzzy-search-code-completion-engine-for-vim ,想收藏到美味书签,点击脚本,提示我输入用户名和密码,开始没在意,以为cookie之类的过期了,就输入提交了,没想到点击没反应。

我再打开其他的网站,点收藏,可以直接收藏不需要登陆。这时我就纳闷了,打开审查工具。发现点击收藏之后的登陆居然被拦截了,用户名和密码全部被这个网站截取。
点击登陆居然请求了这个URL, http://val.markovic.io/cdn-cgi/pe/bag?r[]=http%3A%2F%2Fmeiweisq.com%2Flogin%3Femail%3Dfriskfly%40gmail.com%26password%3Dzxcvb3%26cb%3Dlogin_cb 很明显我的邮箱和密码都被这个网站记录下来了。

我是前端菜鸟,有几个问题,
1.为什么我的美味书签在这个网站上会被要求登陆
2.在前端怎么拦截这种插入script的请求。
3.怎么防范这种安全问题,密码加密传输?
4.第三个问题,是我看美味书签的这段收藏的js脚本,有一段很不明白。如下:

var host = "meiweisq.com";
if(host.indexOf('host') > 0) {
host = 'meiweisq.com';
}
第一行明显已经把host写死了,为什么下面判断字符串中有没有host呢?
5804 次点击
所在节点    问与答
14 条回复
friskfly
2013-02-07 09:24:09 +08:00
一大早沉到最底下了。。。。
不知道有哪些比较熟悉前端的朋友 @Frannk @zythum
zythum
2013-02-07 10:06:37 +08:00
先说jsonp不能post 所以基本只能做读接口。不能做写接口。
这种需要登陆的场景基本应该都是做iframe嵌入比较靠谱一些。
对于第三方保存你的密码的还是请慎重。

他的host是他自己域名的字符串。用来继续调它站点的js和css的。不用在意。
前端是没法拦截注入js的。这个很遗憾。
friskfly
2013-02-07 10:28:32 +08:00
@zythum 还是有点不太明白,能再细一点吗?
既然前端没法拦截注入的js,那这个网站怎么把请求转移到它的域名下的?
zythum
2013-02-07 10:32:10 +08:00
@friskfly 还是没办法。所以说ajax不允许跨域请求就是这个一个关系。浏览器来保证安全性。
所以就那么几种跨域通信。 ifrome提交,jsonp请求。
jsonp请求的好处是可以callback。ifrome做callback其实也是可以的,只是需要双方都需要约定。html5有个叫做postmassage什么的对吧。
est
2013-02-07 10:39:33 +08:00
有人和我一样把 美味书签 当成 del.icio.us 的么。。。
friskfly
2013-02-07 10:48:09 +08:00
@zythum 汗,怎么感觉你回答的和我问的不是同一个问题。
我的意思是我在 http://val.markovic.io/blog/youcompleteme-a-fast-as-you-type-fuzzy-search-code-completion-engine-for-vim 上点击书签栏上的美味书签js,为什么请求的js,确是在当前域名下的呢?中间有个代理的过程,http://val.markovic.io/cdn-cgi/pe/bag?r[]=http%3A%2F%2Fmeiweisq.com%2Fstatic%2Fjs%2Fsave_v3.js%3F0.6207124525681138
似乎用cloudflare 做 cdn 的网站都会这样。


@est 美味书签就是 del.icio.us 的中文版。
Frannk
2013-02-08 12:02:07 +08:00
额 技术细节没想明白
猜测是cloudflare脚本的安全策略
不允许脚本随意注入 而是上报脚本并通过白名单
防止产生安全隐患
没想到cloudflare做了这么多
keakon
2013-02-08 13:43:09 +08:00
CloudFlare 有个 Rocket Loader 功能,可以异步加载 JS。估计是 CloudFlare 自己帮你获取 JS,然后返回给你。这玩意好像每 25ms 执行一次,就把美味书签生成的 script 给替换掉了。
https://support.cloudflare.com/entries/22063463-what-does-rocket-loadertm-do
zhangxiao
2013-02-08 15:22:10 +08:00
我对jsonp的理解比较简单... ajax默认不能跨域,但是这种通过收藏栏执行的js,其实可以在你的当前页面dom里引用一个js,也就是加上一个<script>标签。那么自然浏览器会给这个js文件所在的服务器发请求。这个请求可能是指向一个真的js,或者是其它任何东西。这个请求还可以跟随任何参数(包括你在当前域的cookie)。服务器得到这个请求,可以根据参数以及其他所有的变量,组织所返回的js,被返回的js又可以被页面执行,其实就充当了很大一部分ajax的角色。
zhangxiao
2013-02-08 15:24:07 +08:00
上面关于cookie的需要澄清一下,这个地方我说的cookie能被发送,不是通过浏览器的行为,因为一般这个js所在的域和你当前的域是不同的,所以浏览器是不会发送当前域的cookie的。但是通过收藏栏执行的js本身可以读取当前域的cookie,然后放在url里作为参数发送。
zhangxiao
2013-02-08 15:28:45 +08:00
刚才又看了下你文中提到的那个网站。貌似这个网站的js拦截了所有对资源的引用(包括js文件),将请求转发到它的cdn解析去了,应该是为了从cdn下发资源文件吧。所以你的信息理论上是安全的,因为他们应该不会去分析利用。。。
friskfly
2013-02-09 01:47:42 +08:00
谢谢楼上各位! @Frannk @keakon @zhangxiao
不过好像还是没能回答我的问题,最关键的就是cloudfare怎么能够在前端拦截到插入的script请求的?
春节人似乎不多,节后再看看有没有哪位朋友了解的。
friskfly
2013-02-09 01:57:55 +08:00
@keakon 你是说浏览器还没来得及请求,链接就被替换掉了?这方法实现的好暴力,好有才。有空测试下是不是这样的。 谢谢了,春节愉快。
zhangxiao
2013-02-09 03:42:58 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/59985

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX