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

2018-10-30 10:08:03 +08:00
 nyse

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

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

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

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

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

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

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

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


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

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

既然引用第三方 JS,已经谈不上限制 localStorage 访问的问题,只要能执行代码,有什么代码不能执行呢?这何止是 普通 XSS 攻击能比呢……如果真的如楼主所想,不同域名的 JS 不能访问 cookie 和 localStorage,那么凡是涉及到 Ajax (如果请求时需要携带 cookie )和访问 cookie/localStorage 的代码都要放在同一个域下面了。再说 cookie 分域名存储的问题,localStorage 难道不是吗……只要同源,cookie 和 localStorage 都一样访问。
ragnaroks
2018-10-31 08:49:49 +08:00
尝试下 vuex+websocket,缺点就是刷新网页或关掉=登出,但是这个也能被解决

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

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

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

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

© 2021 V2EX