楼主:
freebug (Freebug)
2023-01-28 20:34:01我最近在开发一个“线上测验”的网页
前端配合后端PHP
线上测验的系统要刚好在5分钟让使用者作答
不能提早交卷也不能迟交
虽然我可以用前端的JavaScript 计时器计时
不过这样只能防君子不能防小人
不法人士还是可以透过开发者工具伪造请求绕过网页的计时器
所以这问题势必要用后端来解决
我起初的想法是在后端开始出题时先用session记录当时的timestamp
然后之后当服务器后端接收到任一请求时,检查收到时的timestamp跟当初session记录的
timestamp相减是否刚好为5分钟
不过这样又会有另外一个问题
因为网络传递请求一定会有延迟
而每次的延迟时间都不同(也会根据使用者网络情况有所差异)
所以不管前端后端好像都无解?
各位有什么想法吗?
换个角度思考,有必要到精确到连网络延迟都算进去吗?
作者:
cspy (Perfect Stranger)
2023-01-28 21:04:00设计一个key的算法 这样可以避免非合法的送出
作者:
ssccg (23)
2023-01-28 21:05:00要算网络延迟看NTP的作法,要避免使用者网络问题就是要多个不同地方的server,然后timestamp要签章
作者:
cspy (Perfect Stranger)
2023-01-28 21:10:00计时的部分还是需要用js去计
作者:
ko27tye (好滋好滋)
2023-01-28 21:41:00用个心跳包阿 延迟过久就当断线了
后端纪录时间是对的,然后时间一到在后端API会检查超过时间就不能对考试的任何操作进行动作,前端就看有没有动画或是其他需求要做
作者: s06yji3 (阿南) 2023-01-28 21:51:00
网络延迟10分钟你要算还是不算...
我原本以为是毫秒级的网络延迟,如果是分钟级的,我想关注在改善受测者或是系统的环境,会比关注在算法好得多吧如果以台湾的网络环境来看,会延迟到分钟级,除了受测者跑去搭大众运输然后刚好过山洞没讯号外,再来就是ISP瞬断,那这是要怎么算XD
作者:
Hsins (翔)
2023-01-28 22:01:00比较好奇是什么类型的测验跟受众... 需要这么来防...
作者:
final01 (牛顿运动定律)
2023-01-28 22:08:00黑客大赛?XD
作者:
GoalBased (Artificail Intelligence)
2023-01-28 23:00:00测验差个30秒无所谓
作者:
MoonCode (MoonCode)
2023-01-28 23:29:00想请教开发者工具碰不到的地方
应该说是不能 console 直接改, debugger 还是无法
把测验题目全部放canvas里面 打上时间戳记录影起来五分钟了不起100~200M吧 ㄎㄎ
验证请求防止他人伪造的方法ssr: csrf token with formspa: csrf token + samesite cookie将csrf token设为开始时间的杂凑可防止man in middle 但原po是想再防只本人使用其他行为(如爬虫)的操作吗?印象中react build过也无法使用开发者工具 把计时模组包成一个小元件ok吧?
作者: s06yji3 (阿南) 2023-01-29 01:01:00
在浏览器跑的JS基本都抽的出来吧
红明显 这是什么意思 不能提早交也不能迟交?为什么我看不懂 这人类办不到的吧 不懂这目的的意思有没有人能够白话文说明一下这是在干嘛??
总之就是他要前端不能作弊 后端又能容忍网络延迟几分钟不偏不倚的刚刚好五分钟*不偏不倚刚好五分钟的"网页操作时间"
我大概知道不能提早交是前端作弊 这部分还能懂不能迟交是怎样 我使用者也要在五分钟的瞬间点送出?写完考卷看到计时器 4:59.59的瞬间去按下去就对了==
5:00的时候就不允许交卷吗 这样谁办得到 我哪里搞错@@哦哦有道理 靠北喔要讲清楚啊 感谢解答妈的想老半天
我是觉得没啥正常的解法啦 尤其是原po连什么延迟好几分钟都想考虑进去然后又要假定使用者取得前端的原始码话说如果人家都这么猛了 你直接给他满分不行吗 XDDD
笑死 我只觉得原po表达能力可能要再练一下不过原PO思考满缜密的 做网页想多点应该算是好事?不过菜鸡如我好奇的是伪造绕过计时器 有那么简单吗这跟跳过广告是不是类似的东西 有没有相关资料刚好在研究request的东西 满有兴趣了解实作这块的XDD
作者: guanting886 (Guanting) 2023-01-29 03:00:00
数据库记录比较适合吧,使用者点选开始作答时就记录这个使用者针对该项课程测验开始的时间、预估何时结束测验、前端就只算剩几分钟,并且使用者的每一项作答会同步到数据库内。这样好处是使用者浏览器挂掉、关掉、连线问题 使用者应该还可以回到课程平台去找开测验继续做最后不论是否有做完 都还有最后填写的答案 若一个测验有30题,使用者填到第28 题电脑或网络有问题 至少可以控制风险让使用者损失最小若将这种控制存放在session 你作答会被锁在当下,只要发生任何意外,例如使用私密浏览模式时不小心关掉,下次开启时 使用者的 cookie 的 session id 就变新的,你后端在认的时候就对不上了
作者:
luke72 (ccc)
2023-01-29 03:59:00考试都有条文规定,糟糕的网络环境后果自负这是法律问题不是技术问题而且真正严谨的认证考试,是要搭配全程录影的
作者:
RINPE (RIN)
2023-01-29 07:29:00不能提早交? 时间到会自动送出的意思吗
作者: k798976869 (kk) 2023-01-29 08:20:00
这很老板思维 需求都说不清楚
工程师想太多不一定是好事,尤其是偏离实际情境太远,只是增加了系统复杂度,但只解决了很微小的问题
你可以允许一个延迟最大值 但不可能太大session可以设置过期 所以不用管前端的timestamp
作者:
qrtt1 (有些事,有时候。。。)
2023-01-29 14:56:00时间差太多,这连 https 都不能正常运作了呗?
作者:
DrTech (竹科管理处网军研发人员)
2023-01-29 15:22:001.机器都办不到完全精确5分钟计时。2.如果你默认立场网络会延迟几分钟,那么这个需求根本不合理。 标准的,需求错误。拿掉网络会延迟几分钟的情况再来讨论吧。照这种逻辑,使用者电脑配备都要考量进去了,不然前端执行运算时间不同。何必庸人自扰呢。根本不用抓精确5分钟,才是现实做法。
这应该是分两段 前端五分钟停止作答(可作弊 停用js等) 所以第二段要在作答时写入时间,送出测验后超过五分的皆为无效测验 搞那么复杂干嘛
作者:
OnlyRD (里巷人)
2023-01-29 18:27:00socket timeout ? 其实使用者连线不稳,应该就要拒绝操作了,即使它超时才提交。到底有什么应用是连线不稳定还可以延时正确提交?难不成他一年后重连也ok?感觉需求设计有点问题。
作者:
luke72 (ccc)
2023-01-29 19:02:00我觉得先弄清楚这是什么等级的考试系统吧,小考还是国考学校小考根本不用想这么多防弊,国考指考一定要进考场
作者:
luke72 (ccc)
2023-01-29 19:04:00然后网络延迟最多不就tcp timeout吗,怎么到几分钟的
作者:
luke72 (ccc)
2023-01-29 19:05:00还是这个系统不允许超时,却允许tcp无限重传?
作者:
luke72 (ccc)
2023-01-29 19:08:00原po说网络延迟千万别小看阿
现实来说应该会有个考试中心跟监考人员,要是真的出这种网络大掉包,应该是透过例外处理的方法,通知考试重来之类的
作者:
gmoz ( This can't do that. )
2023-01-29 19:50:00侦测网络延迟过多直接拒绝使用者作答就好
作者:
wt (Time to Change!)
2023-01-29 20:15:00规格需求不够明确,要回头讨论需求情境跟目的目前描述下,网络延迟 跟 伪造作弊两者分不出来
作者:
DrTech (竹科管理处网军研发人员)
2023-01-29 21:03:00如果需求是:确保公平性。结果你只想着:"保证每个人都精确做答五分钟",显然是弄错需求了。
作者: superpandal 2023-01-29 23:49:00
很神奇的需求 肯定没办法简单解决但可以从做游戏的方式思考 用心跳和记录撰写进度着手
作者: c8dog (草莓猪乌梅猪百香狗) 2023-01-30 01:05:00
如果直接把浏览器关掉你要怎么比对 timestamp? 很明显坚持要完美比对 timestamp 不是合理做法
作者:
Ekmund (是一只小叔)
2023-01-30 10:30:00假设request会被fake的话代表你protocol都被破了这个前提就让前端凉得差不多了吧 XD
作者:
knives 2023-01-30 10:34:00要作真的,一定是看后端,永远都不要相信前端
作者:
Ekmund (是一只小叔)
2023-01-30 10:37:00而且“测验”+绑session就表示默认使用期间必须保持连线状态 这样考虑延迟单位到以分钟计不是很怪?如果要纳入这么极端状况的用户 那5分钟要求就很突兀啦w感觉是你把需求跟目标族群弄错了什么耶
作者:
shring (洽卡洽卡啪打碰)
2023-01-30 10:53:00后端延迟送达你要怎么确认不是伪造的?
很简单 加个验证码不过我们这样回没什么用 原po应该要把需求写详细点
作者:
gmoz ( This can't do that. )
2023-01-30 14:18:00我也觉得原PO过早于纠结怎么确认5分钟 先把需求跟背景弄清跟相关承办或是user 再做多一点的情境确认
作者:
MyNion (Nion Lee)
2023-01-30 15:20:00前端五分整自动送出&跳转,后端五分七秒后停止接收剩下的设备与网络问题干我屁事?作答前规则就要声明清楚,请使用者后果自负
作者:
luke72 (ccc)
2023-01-30 18:27:00自动送出可以disable js停止,写完再启动送出,说网络延迟
作者: c8dog (草莓猪乌梅猪百香狗) 2023-01-31 02:04:00
原 PO 比较像是被公司的 PM 吓到然后无限纠结五分钟
作者:
knives 2023-01-31 06:34:00这肯定是87pm 又在想一些不可能实现的87需求
作者:
gtjs45 (JK)
2023-01-31 08:03:00先搞清楚需求再来问好不好
作者:
needy (needy)
2023-01-31 08:44:00又一个经典工程师想太多跟现实需求脱节的案例 你假设网络会延迟几分钟? 那要不要假设电脑会当机? 当然系统排除越多例外状况越好 但好的工程师要能在技术成本和效果之间做取舍绝大部分状况只需要前端计时就好 确实纯前端有有可能被窜改 但你的测验情境是面向非专业人士的话 几乎没几个人能办到 不然再加上交卷时在后端验证时间 能应付99.99%的场景
作者:
gmoz ( This can't do that. )
2023-01-31 10:22:00先去跟PM说做不到 然后假装退一步跟他说先求有再求好
作者:
ssccg (23)
2023-01-31 12:50:00基本上没有哪个系统用后端计时,又去容忍前端延迟超过几秒网络烂你自己家的事,你要不要先确定好这需求真的存在电竞游戏延迟太长就是断线,容忍延迟时间长到隔壁的都能跑来偷看萤幕再回去操作的还有人要比?
作者:
Ekmund (是一只小叔)
2023-01-31 14:43:00还是会有个一咪咪缓冲当临界啦...卡buffering/IO还是其他什么鬼的 都有可能让逻辑段在处理到的时候超过那么几毫秒不过顶多就给个几秒吧
网络延迟之外 计时本身也会有误差只要不是完全的0误差 就只能订一个可接受的范围
作者:
wateryc (歪C)
2023-01-31 15:26:00很适合当老板或客户或pm,提什么烂需求
想太多 就算你客制client也一样会被破解 钻牛角尖有点笨直接server计时5分+10秒当缓冲就够了顶多帮他几个动作或每15秒自动储存一次就够 别想太美好
作者:
imgodd (新手请指教)
2023-02-01 05:45:00前后端都做计时,结束时统一用人工验证
要是他五分钟内就破解你的东西了 你还不给他过吗??
作者: wheateardoll (半分妆成雪霜天) 2023-02-02 08:01:00
这么奇怪的要求,搞不好是政府的案子?
作者: ZincAllure 2023-02-02 11:17:00
不能提早不能迟交是什么意思 要刚好5分钟的那一秒交吗