通过 <script>
标签引入其他域名的 JS,可以直接读取 localStorage 的内容,这样不是比 cookie 更不安全吗。
Cookie 好歹分域名存贮的,而且可以通过 HttpOnly 不让 JS 读取到。
像现在很多前后端分离的项目,把 token 存 localStorage,万一引入的第三方 JS 来源有问题,安全风险岂不是很大?
1
airyland 2018-10-30 10:15:32 +08:00
风险当然是自己判断,引用大量 npm 模块也都是风险,使用 chrome 插件也能读取各种数据。
内部外部 js 又如何判断呢,引用了静态资源域名或者 cdn 文件是不是也算外部了。 |
2
z0ne 2018-10-30 10:18:55 +08:00
在当前域引入第三方的 js 和引入本地的 js 的安全性是一样的。
代码执行也是在你当前域上执行,所以不会有引入其他地址的 js,其他地址就能获取当前地址的 storage 等信息。 除非第三方 Js 代码自动读取 storage 然后进行回传。 |
3
nyse OP |
4
t6attack 2018-10-30 10:22:41 +08:00
首先,就不该放私密的东西。然后,外部 js 源的信任问题,要自己把握好。
xss 漏洞要极力避免的,但引入外部 js 就等于直接把权限交出去了。人家可不仅仅是能偷 cookie、localStorage 的问题。还可以以用户名义执行敏感操作。比如发帖、修改密码等。 |
5
nyse OP |
6
z0ne 2018-10-30 10:25:30 +08:00
@nyse 是的,当初 github 被 d 也是因为某大厂 js 问题(“应该”是被劫持)
所以,如果不放心的话,js 还是放同站吧,如果觉得速度慢,可以自己做个 cdn 存储的静态域,上传自己信任的 js 库 |
7
nigelvon 2018-10-30 10:28:58 +08:00
老铁,引入 js 不分外部还是内部啊。
|
8
t6attack 2018-10-30 10:29:10 +08:00 1
还真出过类似的安全事件。比如 discuz!后台,有引入官方域名下的 JS,名义上是接收升级通知、公告等功能。但实际上这也是一个间接后门。官方可以通过这个通道,对你网站做任何事。
然后,在 2009 年,有黑客把这个域名劫持了,成功黑了一大波论坛。基本上,劫持时间段内登录后台的站长全中招了。。 http://tech.163.com/09/0108/15/4V55DUGA000915BF.html |
9
airyland 2018-10-30 10:31:21 +08:00
其实担忧的话也不只是外部 js 吧,你自己域的文件用 http 可能会被劫持,如果被黑即使用 https 也会被篡改,用 cdn 服务的话账号被盗文件也会被修改。每个环节都可能有问题,只能做好自身数据安全和监控。
|
10
SuperMild 2018-10-30 10:32:59 +08:00
为什么这样设计?因为如果设计为引入 js 没有权限,会被骂得更惨。
没有完美,只有选择和取舍。 |
11
morethansean 2018-10-30 10:57:10 +08:00
@z0ne 都偷偷改了,那什么事情干不出来啊?还需要读 localStorage ?像楼上说的,我直接读 input 框里的密码,我直接执行敏感操作。
localStorage 设计出来也不是让你像 cookie 那样用的啊,他又不能像 cookie 一样 request 的时候能带在 header 里发给服务器,没懂为什么要把 token 这种东西存在 localStorage 里面。 |
12
z0ne 2018-10-30 11:11:36 +08:00
@morethansean 一些 BaaS 的前端是这么设计的,通过 localStorage 存储已经登陆的信息(包含 sessionToken ) 这样就能持久化保持在线状态了,然后 SDK 请求的时候把 sessionToken 放入 header 里即可后端判断用户状态。
|
13
est 2018-10-30 11:33:11 +08:00 1
> Cookie 好歹分域名存贮的,而且可以通过 HttpOnly 不让 JS 读取到。
其实你可以给 localStorage 加个密。密钥通过 HttpOnly 传递。 |
14
est 2018-10-30 11:34:36 +08:00 1
还可以通过 script-src 来限制第三方 js。。。
然并卵。。国内 http 劫持直接插入到 <html 前面。。 |
15
whileFalse 2018-10-30 12:01:16 +08:00
@est localStorage 的秘钥 js 读不到的话,localstorage 就没啥用了吧。用来存大量数据然后原样传回服务器解密?
|
16
est 2018-10-30 12:30:05 +08:00
@whileFalse 不是,LZ @nyse 的意思是 localStorage 缺 HttpOnly 这个机制。那么你把 HttpOnly 的机制强行加到 localStorage 就行了。。。
|
17
nyse OP @est #16 我可没说 localStorage 要支持 HttpOnly,毕竟 localStorage 服务器端是设置不了的,只是觉得应该加上域名限制。
|
18
iNaru 2018-10-30 13:24:47 +08:00
CSP connect-src 白名单限制第三方脚本回传数据吧。
|
19
kerr92 2018-10-30 17:22:15 +08:00
楼上各位都解释得很清楚了。
既然引用第三方 JS,已经谈不上限制 localStorage 访问的问题,只要能执行代码,有什么代码不能执行呢?这何止是 普通 XSS 攻击能比呢……如果真的如楼主所想,不同域名的 JS 不能访问 cookie 和 localStorage,那么凡是涉及到 Ajax (如果请求时需要携带 cookie )和访问 cookie/localStorage 的代码都要放在同一个域下面了。再说 cookie 分域名存储的问题,localStorage 难道不是吗……只要同源,cookie 和 localStorage 都一样访问。 |
20
ragnaroks 2018-10-31 08:49:49 +08:00
尝试下 vuex+websocket,缺点就是刷新网页或关掉=登出,但是这个也能被解决
|