V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
persona5
V2EX  ›  程序员

前端如何处理用户修改本地时间来绕过前端时间卡控最合适?

  •  
  •   persona5 · 2021-06-04 09:01:53 +08:00 · 3094 次点击
    这是一个创建于 1028 天前的主题,其中的信息可能已经有所发展或是发生改变。

    B/S 架构系统,内网使用,不连外网。

    一些请求需要对提交数据中的时间参数进行卡控,自然前端、后端都会进行校验。

    现在问题是有些客户会尝试去修改操作系统时间( Windows ),来绕过前端的时间填写校验。

    虽然后台服务也会校验,并在前端提示,但是现在希望前端卡控也能正常工作。

    目前暂时处理方式是,前端需要获取当前时间时,去请求接口获取服务器时间,以服务器时间为准,不获取本地操作系统时间。

    请问有没有更好更合理的实践方式?

    16 条回复    2021-06-07 14:23:40 +08:00
    InternetExplorer
        1
    InternetExplorer  
       2021-06-04 09:09:06 +08:00   ❤️ 3
    response header 里有个时间,可以直接取这个时间作为服务器时间
    musi
        2
    musi  
       2021-06-04 09:09:59 +08:00
    加载页面时后端下发一个时间戳,前端的卡控都依据这个时间戳来进行
    learningman
        3
    learningman  
       2021-06-04 09:12:21 +08:00 via Android
    前端就是绝对不可信的,后端做好校验就可以了。
    TomVista
        4
    TomVista  
       2021-06-04 09:23:25 +08:00   ❤️ 1
    额,内网的东西,这个情况更应该优先考虑从规则 /法律 /纪律 方面来解决问题。
    Rache1
        5
    Rache1  
       2021-06-04 09:33:51 +08:00
    确实有些烦,最近在做一个倒计时的功能也是有类似的问题,用户改了本地时间就会导致倒计时展示不对,如果 采用 xhr 的方式来获取远程服务器 header 中的时间的话,再首次加载页面就存在一个等待时间,其次,还要添加轮训或者随机轮训去同步服务器时间,这不是最重要的,最重要的是还要在 js 中根据获得的服务器时间自行实现 +1s 的操作,就觉得很麻烦 😌
    passerbytiny
        6
    passerbytiny  
       2021-06-04 09:46:52 +08:00 via Android   ❤️ 7
    首先你要明白(或者说让产品明白),只有后端校验才是用于安全的,前端校验只是为了 UI 体验。对于故意绕过前端校验的用户,你压根就不用考虑甚至应当降低他们的 UI 体验——这时候去掉前端校验才是更好的选择。
    shintendo
        7
    shintendo  
       2021-06-04 10:19:04 +08:00   ❤️ 6
    始终记住:前端的一切都在用户的完全掌控之下,对前端提交的任何东西,必须并且只能由后端进行校验。
    之所以有前端校验、前端权限控制这些东西,目的只是为了提升*正常用户*的使用体验,比如在填写表单的过程中提示错误(而不是提交之后才被告知校验不通过),比如对没有权限访问的功能进行隐藏(而不是用户点进去后才被告知无权访问)。
    篡改系统时间显然属于不正常访问,前端不需要考虑这种情况的使用体验。说得夸张点,即使你解决了篡改系统时间的问题,用户篡改你的 js 怎么办,用户自制浏览器怎么办,用户抛开前端直接 postman 模拟请求怎么办……
    IvanLi127
        8
    IvanLi127  
       2021-06-04 10:53:03 +08:00
    如果要求不高,可以上 https,时间差太多就无法访问了
    shengchen11
        9
    shengchen11  
       2021-06-04 11:26:11 +08:00
    即使是向后端请求服务器时间,用户可以在客户端拦截请求并修改的,同意 passerbytiny 的观点
    woodensail
        10
    woodensail  
       2021-06-04 11:34:53 +08:00   ❤️ 1
    首先要明确一点,前后端的校验目的是不一样的,后端校验是为了防止攻击,而前端校验是为了用户体验。

    其中「端校验是为了用户体验」的意思是指,假设用户没有故意对抗操作的情况下,正常操作用户不应该看到他不应该看到的内容。至于用户故意对抗时则不做处理,任由页面异常,至于这时候发出的异常请求,则有后端负责拦截。

    其中具体到时间方面,用户时间不准一般可以认为是正常操作,这个只需要进入页面时请求一次服务端时间记录本地时间偏移量即可。而用户在操作中反复调整时间,或者通过 js 钩子来 hook 则认为是非法操作,前端不负责对非法操作的拦截,毕竟你也拦不住不是吗,他甚至完全可以直接调用你发请求的方法。
    LoNeFong
        11
    LoNeFong  
       2021-06-04 11:48:03 +08:00
    "不要相信任何用户的操作"
    后端做好校验, 前端随他异常
    no1xsyzy
        12
    no1xsyzy  
       2021-06-04 12:02:14 +08:00   ❤️ 1
    楼上说得很清楚了,UI 是为了提升体验的,我坚持认为,最优秀的网页应用应当不需要 JS 也能正常工作(参考:Progressive Enhancement )。
    不过,想让非技术角色理解这一原理,可能需要一些技巧,比如修改语言词汇:
    ```
    B/S 架构这个说法具有迷惑性
    在这一场景下不妨叫它 MC/S 架构( modern client / server 或者 manipulable client / server )
    或者你也可以称 B/S 为 betrayer/server 架构
    ```

    ——

    不过,不知是否注意到这一点,这里更根本的问题是:为什么会有人会尝试去修改系统时间来绕过前端时间填写?
    1. 是不是操作人员流程不规范?比如某些信息应当录入时没录入,过了几个月才录入。
    2. 是不是流程设计本身不合理?比如某些信息本当录入时不具备录入条件,过了几个月才有足够的信息有录入条件。
    3. 是不是该校验添加了超过流程的限制?比如流程本身未要求即时录入(比如类似 2 ),但软件却非要即时录入。
    persona5
        13
    persona5  
    OP
       2021-06-04 14:18:07 +08:00
    @TomVista
    @no1xsyzy

    我解释一下,系统中对一些时间填写的卡控,都是使用方领导和需求人员核对确定的,卡控确实是合理的,在没有电子化,使用纸质文档的时候就是这么要求的。填写数据的人是自行去修改系统时间的,就是为了尝试去绕过这个卡控,而不是流程不合理,或者时间不准。
    TomVista
        14
    TomVista  
       2021-06-04 14:40:40 +08:00
    @persona5

    所以这不是个技术问题.dog,这是个法律问题,类似破坏计算机信息系统罪

    解决导致问题的人.jpg
    no1xsyzy
        15
    no1xsyzy  
       2021-06-04 15:32:31 +08:00
    @persona5 所以是「操作人员流程不规范」呗。
    用户进了酒吧点了一份炒面,酒吧爆炸了。
    KisekiRemi
        16
    KisekiRemi  
       2021-06-07 14:23:40 +08:00
    时间戳
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2885 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:19 · PVG 23:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.