V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nyse
V2EX  ›  前端开发

localStorage 的内容外部引入的 JS 也能读取到,这样真的好吗?

  •  
  •   nyse · 2018-10-30 10:08:03 +08:00 · 4480 次点击
    这是一个创建于 2245 天前的主题,其中的信息可能已经有所发展或是发生改变。

    通过 <script> 标签引入其他域名的 JS,可以直接读取 localStorage 的内容,这样不是比 cookie 更不安全吗。

    Cookie 好歹分域名存贮的,而且可以通过 HttpOnly 不让 JS 读取到。

    像现在很多前后端分离的项目,把 token 存 localStorage,万一引入的第三方 JS 来源有问题,安全风险岂不是很大?

    22 条回复    2018-10-31 13:42:34 +08:00
    airyland
        1
    airyland  
       2018-10-30 10:15:32 +08:00
    风险当然是自己判断,引用大量 npm 模块也都是风险,使用 chrome 插件也能读取各种数据。
    内部外部 js 又如何判断呢,引用了静态资源域名或者 cdn 文件是不是也算外部了。
    z0ne
        2
    z0ne  
       2018-10-30 10:18:55 +08:00
    在当前域引入第三方的 js 和引入本地的 js 的安全性是一样的。

    代码执行也是在你当前域上执行,所以不会有引入其他地址的 js,其他地址就能获取当前地址的 storage 等信息。 除非第三方 Js 代码自动读取 storage 然后进行回传。
    nyse
        3
    nyse  
    OP
       2018-10-30 10:20:27 +08:00
    @airyland #1 最常见的像引入第三方的统计代码,这些网站完全有能力获取用户的 localStorage 信息。

    我是想说这么大的问题当初是怎么设计出来的。
    t6attack
        4
    t6attack  
       2018-10-30 10:22:41 +08:00
    首先,就不该放私密的东西。然后,外部 js 源的信任问题,要自己把握好。
    xss 漏洞要极力避免的,但引入外部 js 就等于直接把权限交出去了。人家可不仅仅是能偷 cookie、localStorage 的问题。还可以以用户名义执行敏感操作。比如发帖、修改密码等。
    nyse
        5
    nyse  
    OP
       2018-10-30 10:22:43 +08:00
    @z0ne #2 就像 CDN 上的 JS,完全可后面修改啊。

    一开始引入没问题,后面鬼知道它突然想干嘛,读取 localStorage 后回传完全可以做到。
    z0ne
        6
    z0ne  
       2018-10-30 10:25:30 +08:00
    @nyse 是的,当初 github 被 d 也是因为某大厂 js 问题(“应该”是被劫持)
    所以,如果不放心的话,js 还是放同站吧,如果觉得速度慢,可以自己做个 cdn 存储的静态域,上传自己信任的 js 库
    nigelvon
        7
    nigelvon  
       2018-10-30 10:28:58 +08:00
    老铁,引入 js 不分外部还是内部啊。
    t6attack
        8
    t6attack  
       2018-10-30 10:29:10 +08:00   ❤️ 1
    还真出过类似的安全事件。比如 discuz!后台,有引入官方域名下的 JS,名义上是接收升级通知、公告等功能。但实际上这也是一个间接后门。官方可以通过这个通道,对你网站做任何事。
    然后,在 2009 年,有黑客把这个域名劫持了,成功黑了一大波论坛。基本上,劫持时间段内登录后台的站长全中招了。。
    http://tech.163.com/09/0108/15/4V55DUGA000915BF.html
    airyland
        9
    airyland  
       2018-10-30 10:31:21 +08:00
    其实担忧的话也不只是外部 js 吧,你自己域的文件用 http 可能会被劫持,如果被黑即使用 https 也会被篡改,用 cdn 服务的话账号被盗文件也会被修改。每个环节都可能有问题,只能做好自身数据安全和监控。
    SuperMild
        10
    SuperMild  
       2018-10-30 10:32:59 +08:00
    为什么这样设计?因为如果设计为引入 js 没有权限,会被骂得更惨。

    没有完美,只有选择和取舍。
    morethansean
        11
    morethansean  
       2018-10-30 10:57:10 +08:00
    @z0ne 都偷偷改了,那什么事情干不出来啊?还需要读 localStorage ?像楼上说的,我直接读 input 框里的密码,我直接执行敏感操作。
    localStorage 设计出来也不是让你像 cookie 那样用的啊,他又不能像 cookie 一样 request 的时候能带在 header 里发给服务器,没懂为什么要把 token 这种东西存在 localStorage 里面。
    z0ne
        12
    z0ne  
       2018-10-30 11:11:36 +08:00
    @morethansean 一些 BaaS 的前端是这么设计的,通过 localStorage 存储已经登陆的信息(包含 sessionToken ) 这样就能持久化保持在线状态了,然后 SDK 请求的时候把 sessionToken 放入 header 里即可后端判断用户状态。
    est
        13
    est  
       2018-10-30 11:33:11 +08:00   ❤️ 1
    > Cookie 好歹分域名存贮的,而且可以通过 HttpOnly 不让 JS 读取到。


    其实你可以给 localStorage 加个密。密钥通过 HttpOnly 传递。
    est
        14
    est  
       2018-10-30 11:34:36 +08:00   ❤️ 1
    还可以通过 script-src 来限制第三方 js。。。

    然并卵。。国内 http 劫持直接插入到 <html 前面。。
    whileFalse
        15
    whileFalse  
       2018-10-30 12:01:16 +08:00
    @est localStorage 的秘钥 js 读不到的话,localstorage 就没啥用了吧。用来存大量数据然后原样传回服务器解密?
    est
        16
    est  
       2018-10-30 12:30:05 +08:00
    @whileFalse 不是,LZ @nyse 的意思是 localStorage 缺 HttpOnly 这个机制。那么你把 HttpOnly 的机制强行加到 localStorage 就行了。。。
    nyse
        17
    nyse  
    OP
       2018-10-30 13:24:01 +08:00
    @est #16 我可没说 localStorage 要支持 HttpOnly,毕竟 localStorage 服务器端是设置不了的,只是觉得应该加上域名限制。
    iNaru
        18
    iNaru  
       2018-10-30 13:24:47 +08:00
    CSP connect-src 白名单限制第三方脚本回传数据吧。
    kerr92
        19
    kerr92  
       2018-10-30 17:22:15 +08:00
    楼上各位都解释得很清楚了。

    既然引用第三方 JS,已经谈不上限制 localStorage 访问的问题,只要能执行代码,有什么代码不能执行呢?这何止是 普通 XSS 攻击能比呢……如果真的如楼主所想,不同域名的 JS 不能访问 cookie 和 localStorage,那么凡是涉及到 Ajax (如果请求时需要携带 cookie )和访问 cookie/localStorage 的代码都要放在同一个域下面了。再说 cookie 分域名存储的问题,localStorage 难道不是吗……只要同源,cookie 和 localStorage 都一样访问。
    ragnaroks
        20
    ragnaroks  
       2018-10-31 08:49:49 +08:00
    尝试下 vuex+websocket,缺点就是刷新网页或关掉=登出,但是这个也能被解决
    nyse
        21
    nyse  
    OP
       2018-10-31 09:48:45 +08:00
    @ragnaroks #20 这不就相当于 token 存内存了,不要保存嘛.
    ragnaroks
        22
    ragnaroks  
       2018-10-31 13:42:34 +08:00
    @nyse 用 canvas 算指纹做 token
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2782 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:01 · PVG 20:01 · LAX 04:01 · JFK 07:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.