前后端分离开发后台遇到的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
kajweb
V2EX    程序员

前后端分离开发后台遇到的问题

  •  
  •   kajweb
    kajweb 2019-11-23 04:36:21 +08:00 3054 次点击
    这是一个创建于 2202 天前的主题,其中的信息可能已经有所发展或是发生改变。

    登陆

    正确返回{status:200,data: {token:xxx}}

    错误返回{status:100,data: false}

    问题

    然后被人使用 fidder 将登陆失败时的返回修改为正确,成功进入后台管理页面(可以看到管理页面的结构),但是获得不了数据。

    获取数据结构返回{status:403,data: false} 又被强行修改为 200。

    editor 的上传接口没有鉴权和图片处理,导致图片被成功上传。

    然后现在的问题是:登陆应该怎么拦截,才能不被绕过。

    前端使用 VUE 非 SSR 模式

    第 1 条附言    2019-11-23 10:52:09 +08:00

    https://s2.ax1x.com/2019/11/23/MH4gAg.jpg

    ①:使用fidder代理,修改server返回数据

    ②:修改状态码,强行进入后台。(token为空或者为任意值) beforeRouteEnter应该只是简单判断token时候存在,没有发xhr查验,不过不影响。

    ③:获得分类数据

    ④:由于带错误的token,服务器返回403,data为false。正常情况下应该返回到登陆页面

    ⑤:使用代理修改状态码为200,前端判断获取数据成功,列表为空。没有强行返回登录页

    关于使用权限管理/动态菜单,理论上是可以通过JS分析出各个路由的路径再直接访问,然后就与③同理。

    第 2 条附言    2019-11-23 10:55:23 +08:00
    @chongzi 本来是不影响的,但是负责安全的部门要求我修改登陆逻辑。那边是看到能绕过登陆看到后台界面就说这个有问题……
    29 条回复    2019-11-23 18:49:05 +08:00
    throns
        1
    throns  
       2019-11-23 04:54:44 +08:00 via iPhone
    登陆之后获取用户信息
    throns
        2
    throns  
       2019-11-23 05:04:58 +08:00 via iPhone
    上 https
    eason1874
        3
    eason1874  
       2019-11-23 05:41:07 +08:00
    逻辑上讲很简单啊。

    一、把访客页面和管理页面拆开,管理页面资源(包括 editor )全部通过鉴权才能加载。
    二、editor 接口加上鉴权。
    seki
        4
    seki  
       2019-11-23 06:07:25 +08:00
    不管怎么样后端都是要加鉴权的。前后端分离的 SPA 的情况下,前端的鉴权只是用户体验上的改进,完全不可依赖。不管你加什么逻辑,用户在你的代码里面把逻辑删掉就还是能愉快地跑
    donyee
        5
    donyee  
       2019-11-23 06:26:30 +08:00
    后端是 Java 的话,加上过滤器判断一下,其他语言框架不了解
    ericgui
        6
    ericgui  
       2019-11-23 06:29:34 +08:00
    对啊,怎么不鉴权呢
    Leigg
        7
    Leigg  
       2019-11-23 07:05:01 +08:00 via Android
    资源上传接口不仅要鉴权,还要限制资源类型,大小,防止被当做网盘用或者恶意攻击。
    Immortal
        8
    Immortal  
       2019-11-23 07:51:41 +08:00
    后端看起来是鉴权了的 但是没有写在拦截器、中间件一类的地方
    不然不会出现接口数据 403 了
    图片上传的路由应该放在了“无需校验”的那一块了 和后端沟通下 改下就好了
    其实我觉得如果 editor 能上传 根本无需大费周章的用 fidder 改 status 拿到上传路由直接 postman 应该也能成功
    Immortal
        9
    Immortal  
       2019-11-23 07:52:24 +08:00
    @Immortal
    “后端看起来是鉴权了的 但是没有写在拦截器、中间件一类的地方”
    改为
    “后端看起来是鉴权了的 但是没有把上传路由加在拦截器、中间件一类的地方”
    keepeye
        10
    keepeye  
       2019-11-23 09:15:08 +08:00
    上传文件加上鉴权就是了 前端也只能那样了
    geekdocs
        11
    geekdocs  
       2019-11-23 10:11:02 +08:00
    上传接口都不鉴权,真是艺高人胆大~
    Vhc001
        12
    Vhc001  
       2019-11-23 10:21:18 +08:00   1
    @throns #2 https 是防止中间人攻击的,你让楼主上 https 就是掩耳盗铃了。
    chongzi
        13
    chongzi  
       2019-11-23 10:23:11 +08:00
    好巧,这部分逻辑我刚重新理了
    1.接口方法和前端操作分别管理
    2.前端操作关联接口方法(多对多)
    3.用户权限最终关联前端操作(中间可能还有角色、部门、岗位之类的关联)
    这样达成的效果
    1.前端界面能显示哪些内容(包括菜单)依赖登录后接口返回的权限数据(前端操作列表)
    2.即便他了解你的系统可以手动构造数据访问接口,接口也可以判断他有没有权限
    Vhc001
        14
    Vhc001  
       2019-11-23 10:24:04 +08:00
    @throns #2 https 是防止中间人攻击的,并不能防止客户端修改数据,就像你网站上 https 并不能防止访客浏览器上安装的插件拦截网站广告一样。你让楼主上 https 就属于掩耳盗铃了。
    kajweb
        15
    kajweb  
    OP
       2019-11-23 10:33:54 +08:00
    @throns @Immortal 是使用代理直接修改返回数据了,与后端无关。
    @eason1874 @geekdocs 管理页面已经拆开了,首页暴露管理入口。然后被绕过登陆了。
    @ericgui 之前不知道怎么回事没有鉴权,现在修改了。
    @Leigg 谢谢提醒
    @Immortal 当时是后端上传接口漏加上这个了,现在已经堵上了。
    @chongzi 就是接口直接返回 403,他看不到数据和上传 /发布数据。稍后我发图说明一下流程。之前讨论过动态菜单,但是想了一下菜单还是写在 route 上了,好像也是能进入页面(可能想得不对)

    上传图片那个地方已经修改了,之前是由于某个原因没有加上,现在已经堵上了。
    就是登陆想不通,应该如何返回数据来限制直接修改数据进行登陆。
    像 @seki 说的,直接在前端删除管理页面的拦截逻辑有没有可能防范?(除非服务器渲染?)
    虽然绕过登陆后看不到数据啥的,但是能进去就感觉有一点点奇怪。
    CoderGeek
        16
    CoderGeek  
       2019-11-23 10:36:03 +08:00
    统一鉴权 你这个权限问题
    chongzi
        17
    chongzi  
       2019-11-23 10:49:07 +08:00
    最坏的情况,他对你的系统了如指掌,
    手动修改了接口返回的数据、直接修改了 js 变量、甚至手动写了个跟你系统一样的页面
    只要他无法正常访问你的接口,就不会对你的系统造成任何影响
    这还有什么顾虑呢
    chongzi
        18
    chongzi  
       2019-11-23 11:15:31 +08:00
    如果他只是修改了登录接口返回的状态码,而没有修改返回的具体数据(比如前端操作列表)
    那你完全可以在 router 跳转的时候拦截
    annielong
        19
    annielong  
       2019-11-23 11:31:39 +08:00
    所以使用 cookie 不是没有原因的,想用 token 就所有页面都加验证
    hyy1995
        20
    hyy1995  
       2019-11-23 11:42:06 +08:00
    看到你列出来的④和⑤,好像这样是无解了。。。
    hotcool100
        21
    hotcool100  
       2019-11-23 11:46:34 +08:00
    前端 nuxt + vue + element
    后端 java + shiro
    前端页面与后端接口方法,都统一使用 shiro 权限标识符做了验证
    muzuiget
        22
    muzuiget  
       2019-11-23 11:48:30 +08:00
    只好上传接口加鉴权了,客户端段代码发出去对方怎么跑也控制不了的。
    lniwn
        23
    lniwn  
       2019-11-23 12:13:00 +08:00
    登录成功之后,不仅仅只是返回状态码,加上校验信息,或者前端判断登录状态码成功之后,再校验下 cookie。
    eason1874
        24
    eason1874  
       2019-11-23 13:21:14 +08:00
    @kajweb #15 能通过前端修改数据进入管理页面,就说明你没有鉴权啊,鉴权了怎么可能绕得过。

    管理页面应该是一个独立的域名或者路径,访客在其他页面登录之后跳转到管理页加载管理资源。未登录访客访问管理页面时,后端通过 session 验证登录状态,session 错误的直接 HTTP 302 到登录页面。

    你是管理页面资源没有做鉴权,访客才能在没有 session 的情况下加载管理页面。
    des
        25
    des  
       2019-11-23 13:29:06 +08:00 via Android
    @kajweb 单独做个登陆页面,可以放到一个单独的路径,其余所有页面都加鉴权就好了
    hushao
        26
    hushao  
       2019-11-23 13:29:48 +08:00 via iPhone
    通过接口控制 html 的渲染是没用的,感觉你需要的是服务端渲染...
    chairuosen
        27
    chairuosen  
       2019-11-23 13:29:55 +08:00
    登录那个不是问题,拒绝修改。看到页面又如何,反正不能操作。本来整个项目代码都给到浏览器了,怎么控制都控制不了。你要是觉得 UI 也是秘密,就改回传统架构,告诉他们评估工期半年。
    hushao
        28
    hushao  
       2019-11-23 14:04:55 +08:00 via iPhone
    @chairuosen 对的,客户端渲染的本质决定了除数据之外的信息都处于开放状态。要么你们的后台单独用个域名,别公开,别人一般也不会知道。
    mmdsun
        29
    mmdsun  
       2019-11-23 18:49:05 +08:00 via Android
    接口没做判断?集成 spring security 吧。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5154 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 01:22 PVG 09:22 LAX 17:22 JFK 20:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86