V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
friskfly
V2EX  ›  问与答

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

  •  
  •   friskfly · 2013-02-06 22:53:33 +08:00 · 5797 次点击
    这是一个创建于 4112 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我也不知道这个问题是不是菜鸟问题,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呢?
    14 条回复    1970-01-01 08:00:00 +08:00
    friskfly
        1
    friskfly  
    OP
       2013-02-07 09:24:09 +08:00
    一大早沉到最底下了。。。。
    不知道有哪些比较熟悉前端的朋友 @Frannk @zythum
    zythum
        2
    zythum  
       2013-02-07 10:06:37 +08:00   ❤️ 1
    先说jsonp不能post 所以基本只能做读接口。不能做写接口。
    这种需要登陆的场景基本应该都是做iframe嵌入比较靠谱一些。
    对于第三方保存你的密码的还是请慎重。

    他的host是他自己域名的字符串。用来继续调它站点的js和css的。不用在意。
    前端是没法拦截注入js的。这个很遗憾。
    friskfly
        3
    friskfly  
    OP
       2013-02-07 10:28:32 +08:00
    @zythum 还是有点不太明白,能再细一点吗?
    既然前端没法拦截注入的js,那这个网站怎么把请求转移到它的域名下的?
    zythum
        4
    zythum  
       2013-02-07 10:32:10 +08:00
    @friskfly 还是没办法。所以说ajax不允许跨域请求就是这个一个关系。浏览器来保证安全性。
    所以就那么几种跨域通信。 ifrome提交,jsonp请求。
    jsonp请求的好处是可以callback。ifrome做callback其实也是可以的,只是需要双方都需要约定。html5有个叫做postmassage什么的对吧。
    est
        5
    est  
       2013-02-07 10:39:33 +08:00
    有人和我一样把 美味书签 当成 del.icio.us 的么。。。
    friskfly
        6
    friskfly  
    OP
       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
        7
    Frannk  
       2013-02-08 12:02:07 +08:00
    额 技术细节没想明白
    猜测是cloudflare脚本的安全策略
    不允许脚本随意注入 而是上报脚本并通过白名单
    防止产生安全隐患
    没想到cloudflare做了这么多
    keakon
        8
    keakon  
       2013-02-08 13:43:09 +08:00   ❤️ 1
    CloudFlare 有个 Rocket Loader 功能,可以异步加载 JS。估计是 CloudFlare 自己帮你获取 JS,然后返回给你。这玩意好像每 25ms 执行一次,就把美味书签生成的 script 给替换掉了。
    https://support.cloudflare.com/entries/22063463-what-does-rocket-loadertm-do
    zhangxiao
        9
    zhangxiao  
       2013-02-08 15:22:10 +08:00
    我对jsonp的理解比较简单... ajax默认不能跨域,但是这种通过收藏栏执行的js,其实可以在你的当前页面dom里引用一个js,也就是加上一个<script>标签。那么自然浏览器会给这个js文件所在的服务器发请求。这个请求可能是指向一个真的js,或者是其它任何东西。这个请求还可以跟随任何参数(包括你在当前域的cookie)。服务器得到这个请求,可以根据参数以及其他所有的变量,组织所返回的js,被返回的js又可以被页面执行,其实就充当了很大一部分ajax的角色。
    zhangxiao
        10
    zhangxiao  
       2013-02-08 15:24:07 +08:00
    上面关于cookie的需要澄清一下,这个地方我说的cookie能被发送,不是通过浏览器的行为,因为一般这个js所在的域和你当前的域是不同的,所以浏览器是不会发送当前域的cookie的。但是通过收藏栏执行的js本身可以读取当前域的cookie,然后放在url里作为参数发送。
    zhangxiao
        11
    zhangxiao  
       2013-02-08 15:28:45 +08:00
    刚才又看了下你文中提到的那个网站。貌似这个网站的js拦截了所有对资源的引用(包括js文件),将请求转发到它的cdn解析去了,应该是为了从cdn下发资源文件吧。所以你的信息理论上是安全的,因为他们应该不会去分析利用。。。
    friskfly
        12
    friskfly  
    OP
       2013-02-09 01:47:42 +08:00
    谢谢楼上各位! @Frannk @keakon @zhangxiao
    不过好像还是没能回答我的问题,最关键的就是cloudfare怎么能够在前端拦截到插入的script请求的?
    春节人似乎不多,节后再看看有没有哪位朋友了解的。
    friskfly
        13
    friskfly  
    OP
       2013-02-09 01:57:55 +08:00
    @keakon 你是说浏览器还没来得及请求,链接就被替换掉了?这方法实现的好暴力,好有才。有空测试下是不是这样的。 谢谢了,春节愉快。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1101 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:57 · PVG 02:57 · LAX 11:57 · JFK 14:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.