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