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

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

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

    登陆

    正确返回{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   ·   实用小工具   ·   1118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:20 · PVG 02:20 · LAX 10:20 · JFK 13:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.