正确返回{status:200,data: {token:xxx}}
错误返回{status:100,data: false}
然后被人使用 fidder 将登陆失败时的返回修改为正确,成功进入后台管理页面(可以看到管理页面的结构),但是获得不了数据。
获取数据结构返回{status:403,data: false}
又被强行修改为 200。
editor 的上传接口没有鉴权和图片处理,导致图片被成功上传。
然后现在的问题是:登陆应该怎么拦截,才能不被绕过。
前端使用 VUE 非 SSR 模式
①:使用fidder代理,修改server返回数据
②:修改状态码,强行进入后台。(token为空或者为任意值) beforeRouteEnter应该只是简单判断token时候存在,没有发xhr查验,不过不影响。
③:获得分类数据
④:由于带错误的token,服务器返回403,data为false。正常情况下应该返回到登陆页面
⑤:使用代理修改状态码为200,前端判断获取数据成功,列表为空。没有强行返回登录页
关于使用权限管理/动态菜单,理论上是可以通过JS分析出各个路由的路径再直接访问,然后就与③同理。
1
throns 2019-11-23 04:54:44 +08:00 via iPhone
登陆之后获取用户信息
|
2
throns 2019-11-23 05:04:58 +08:00 via iPhone
上 https
|
3
eason1874 2019-11-23 05:41:07 +08:00
逻辑上讲很简单啊。
一、把访客页面和管理页面拆开,管理页面资源(包括 editor )全部通过鉴权才能加载。 二、editor 接口加上鉴权。 |
4
seki 2019-11-23 06:07:25 +08:00
不管怎么样后端都是要加鉴权的。前后端分离的 SPA 的情况下,前端的鉴权只是用户体验上的改进,完全不可依赖。不管你加什么逻辑,用户在你的代码里面把逻辑删掉就还是能愉快地跑
|
5
donyee 2019-11-23 06:26:30 +08:00
后端是 Java 的话,加上过滤器判断一下,其他语言框架不了解
|
6
ericgui 2019-11-23 06:29:34 +08:00
对啊,怎么不鉴权呢
|
7
Leigg 2019-11-23 07:05:01 +08:00 via Android
资源上传接口不仅要鉴权,还要限制资源类型,大小,防止被当做网盘用或者恶意攻击。
|
8
Immortal 2019-11-23 07:51:41 +08:00
后端看起来是鉴权了的 但是没有写在拦截器、中间件一类的地方
不然不会出现接口数据 403 了 图片上传的路由应该放在了“无需校验”的那一块了 和后端沟通下 改下就好了 其实我觉得如果 editor 能上传 根本无需大费周章的用 fidder 改 status 拿到上传路由直接 postman 应该也能成功 |
9
Immortal 2019-11-23 07:52:24 +08:00
|
10
keepeye 2019-11-23 09:15:08 +08:00
上传文件加上鉴权就是了 前端也只能那样了
|
11
geekdocs 2019-11-23 10:11:02 +08:00
上传接口都不鉴权,真是艺高人胆大~
|
13
chongzi 2019-11-23 10:23:11 +08:00
好巧,这部分逻辑我刚重新理了
1.接口方法和前端操作分别管理 2.前端操作关联接口方法(多对多) 3.用户权限最终关联前端操作(中间可能还有角色、部门、岗位之类的关联) 这样达成的效果 1.前端界面能显示哪些内容(包括菜单)依赖登录后接口返回的权限数据(前端操作列表) 2.即便他了解你的系统可以手动构造数据访问接口,接口也可以判断他有没有权限 |
14
Vhc001 2019-11-23 10:24:04 +08:00
@throns #2 https 是防止中间人攻击的,并不能防止客户端修改数据,就像你网站上 https 并不能防止访客浏览器上安装的插件拦截网站广告一样。你让楼主上 https 就属于掩耳盗铃了。
|
15
kajweb OP @throns @Immortal 是使用代理直接修改返回数据了,与后端无关。
@eason1874 @geekdocs 管理页面已经拆开了,首页暴露管理入口。然后被绕过登陆了。 @ericgui 之前不知道怎么回事没有鉴权,现在修改了。 @Leigg 谢谢提醒 @Immortal 当时是后端上传接口漏加上这个了,现在已经堵上了。 @chongzi 就是接口直接返回 403,他看不到数据和上传 /发布数据。稍后我发图说明一下流程。之前讨论过动态菜单,但是想了一下菜单还是写在 route 上了,好像也是能进入页面(可能想得不对) 上传图片那个地方已经修改了,之前是由于某个原因没有加上,现在已经堵上了。 就是登陆想不通,应该如何返回数据来限制直接修改数据进行登陆。 像 @seki 说的,直接在前端删除管理页面的拦截逻辑有没有可能防范?(除非服务器渲染?) 虽然绕过登陆后看不到数据啥的,但是能进去就感觉有一点点奇怪。 |
16
CoderGeek 2019-11-23 10:36:03 +08:00
统一鉴权 你这个权限问题
|
17
chongzi 2019-11-23 10:49:07 +08:00
最坏的情况,他对你的系统了如指掌,
手动修改了接口返回的数据、直接修改了 js 变量、甚至手动写了个跟你系统一样的页面 只要他无法正常访问你的接口,就不会对你的系统造成任何影响 这还有什么顾虑呢 |
18
chongzi 2019-11-23 11:15:31 +08:00
如果他只是修改了登录接口返回的状态码,而没有修改返回的具体数据(比如前端操作列表)
那你完全可以在 router 跳转的时候拦截 |
19
annielong 2019-11-23 11:31:39 +08:00
所以使用 cookie 不是没有原因的,想用 token 就所有页面都加验证
|
20
hyy1995 2019-11-23 11:42:06 +08:00
看到你列出来的④和⑤,好像这样是无解了。。。
|
21
hotcool100 2019-11-23 11:46:34 +08:00
前端 nuxt + vue + element
后端 java + shiro 前端页面与后端接口方法,都统一使用 shiro 权限标识符做了验证 |
22
muzuiget 2019-11-23 11:48:30 +08:00
只好上传接口加鉴权了,客户端段代码发出去对方怎么跑也控制不了的。
|
23
lniwn 2019-11-23 12:13:00 +08:00
登录成功之后,不仅仅只是返回状态码,加上校验信息,或者前端判断登录状态码成功之后,再校验下 cookie。
|
24
eason1874 2019-11-23 13:21:14 +08:00
@kajweb #15 能通过前端修改数据进入管理页面,就说明你没有鉴权啊,鉴权了怎么可能绕得过。
管理页面应该是一个独立的域名或者路径,访客在其他页面登录之后跳转到管理页加载管理资源。未登录访客访问管理页面时,后端通过 session 验证登录状态,session 错误的直接 HTTP 302 到登录页面。 你是管理页面资源没有做鉴权,访客才能在没有 session 的情况下加载管理页面。 |
26
hushao 2019-11-23 13:29:48 +08:00 via iPhone
通过接口控制 html 的渲染是没用的,感觉你需要的是服务端渲染...
|
27
chairuosen 2019-11-23 13:29:55 +08:00
登录那个不是问题,拒绝修改。看到页面又如何,反正不能操作。本来整个项目代码都给到浏览器了,怎么控制都控制不了。你要是觉得 UI 也是秘密,就改回传统架构,告诉他们评估工期半年。
|
28
hushao 2019-11-23 14:04:55 +08:00 via iPhone
@chairuosen 对的,客户端渲染的本质决定了除数据之外的信息都处于开放状态。要么你们的后台单独用个域名,别公开,别人一般也不会知道。
|
29
mmdsun 2019-11-23 18:49:05 +08:00 via Android
接口没做判断?集成 spring security 吧。
|