PTT推薦

[請益] 確保在剛好5分鐘不差作答網頁測驗

看板Soft_Job標題[請益] 確保在剛好5分鐘不差作答網頁測驗作者
freebug
(Freebug)
時間推噓31 推:40 噓:9 →:125

我最近在開發一個「線上測驗」的網頁

前端配合後端PHP

線上測驗的系統要剛好在5分鐘讓使用者作答

不能提早交卷也不能遲交

雖然我可以用前端的JavaScript 計時器計時

不過這樣只能防君子不能防小人

不法人士還是可以透過開發者工具偽造請求繞過網頁的計時器

所以這問題勢必要用後端來解決

我起初的想法是在後端開始出題時先用session記錄當時的timestamp

然後之後當伺服器後端接收到任一請求時,檢查收到時的timestamp跟當初session記錄的timestamp相減是否剛好為5分鐘

不過這樣又會有另外一個問題

因為網路傳遞請求一定會有延遲

而每次的延遲時間都不同(也會根據使用者網路情況有所差異)

所以不管前端後端好像都無解?

各位有什麼想法嗎?

--

※ PTT 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.12.25.127 (臺灣)
PTT 網址

foreverk01/28 21:00換個角度思考,有必要到精確到連網路延遲都算進去嗎?

網路延遲千萬別小看 使用者網路狀況如果真的不好,延遲好幾分鐘都是有可能的

cspy01/28 21:04設計一個key的演算法 這樣可以避免非合法的送出

請問key演算法避免非合法送出的原理是什麼 是用非對稱加密法在哪裡加密? 因為在前端加密應該沒什麼意義 不法人士只要知道網頁原始碼就可以非法製造假的key和請求

ssccg01/28 21:05要算網路延遲看NTP的作法,要避免使用者網路問題就是要多個

ssccg01/28 21:06不同地方的server,然後timestamp要簽章

cspy01/28 21:10計時的部分還是需要用js去計

※ 編輯: freebug (39.12.25.127 臺灣), 01/28/2023 21:23:21

ko27tye01/28 21:41用個心跳包阿 延遲過久就當斷線了

WaterLengend01/28 21:46後端紀錄時間是對的,然後時間一到在後端API會檢查

WaterLengend01/28 21:47超過時間就不能對考試的任何操作進行動作,前端就看

WaterLengend01/28 21:47有沒有動畫或是其他需求要做

s06yji301/28 21:51網路延遲10分鐘你要算還是不算...

foreverk01/28 21:54我原本以為是毫秒級的網路延遲,如果是分鐘級的,我想

foreverk01/28 21:54關注在改善受測者或是系統的環境,會比關注在演算法好

foreverk01/28 21:54得多吧

foreverk01/28 21:57如果以台灣的網路環境來看,會延遲到分鐘級,除了受測

foreverk01/28 21:57者跑去搭大眾運輸然後剛好過山洞沒訊號外,再來就是ISP

foreverk01/28 21:57瞬斷,那這是要怎麼算XD

Hsins01/28 22:01比較好奇是什麼類型的測驗跟受眾... 需要這麼來防...

final0101/28 22:08黑客大賽?XD

vi00024601/28 22:09延遲應該是無解

Lomonosov01/28 22:57不能提早交卷是認真的嗎?

GoalBased01/28 23:00測驗差個30秒無所謂

lovdkkkk01/28 23:16可以用推文有提到的加密

viper970901/28 23:16延遲到分鐘級...這個無解吧XD

lovdkkkk01/28 23:16加密演算法可以加鹽,如果是 5 分鐘就用 300 (秒) 當鹽

lovdkkkk01/28 23:16把相關參數跟方法放在開發者工具碰不到的地方,

lovdkkkk01/28 23:17每秒把鹽的參數 +1,送出時資料過個加密到後端,

lovdkkkk01/28 23:17後端解得出來就表示使用者剛好是在 300 秒時按下送出

lovdkkkk01/28 23:17是說到底為什麼不能提早交啊...

lovdkkkk01/28 23:19考試內容包括手速? 要準秒按鈕?

lovdkkkk01/28 23:24寫 timer 時間到自動點送出算違規嗎? 算的話上面也無效

MoonCode01/28 23:29想請教開發者工具碰不到的地方

lovdkkkk01/28 23:38應該說是不能 console 直接改, debugger 還是無法

kurtsgm01/28 23:45把測驗題目全部放canvas裡面 打上時間戳記錄影起來

kurtsgm01/28 23:49五分鐘了不起100~200M吧 ㄎㄎ

luweber8801/29 00:22驗證請求防止他人偽造的方法

luweber8801/29 00:22ssr: csrf token with form

luweber8801/29 00:22spa: csrf token + samesite cookie

luweber8801/29 00:22將csrf token設為開始時間的雜湊

luweber8801/29 00:22可防止man in middle 但原po是想再防只本人使用其他行

luweber8801/29 00:22為(如爬蟲)的操作嗎?

luweber8801/29 00:25印象中react build過也無法使用開發者工具 把計時模組

luweber8801/29 00:25包成一個小元件ok吧?

sp06343901/29 00:28如果是註冊會員腦袋直覺用 socket

s06yji301/29 01:01在瀏覽器跑的JS基本都抽的出來吧

secretfly01/29 01:03紅明顯 這是什麼意思 不能提早交也不能遲交?

secretfly01/29 01:04為什麼我看不懂 這人類辦不到的吧 不懂這目的的意思

secretfly01/29 01:04有沒有人能夠白話文說明一下這是在幹嘛??

kurtsgm01/29 01:21總之就是他要前端不能作弊 後端又能容忍網路延遲幾分鐘

kurtsgm01/29 01:21不偏不倚的剛剛好五分鐘

kurtsgm01/29 01:22*不偏不倚剛好五分鐘的"網頁操作時間"

secretfly01/29 01:23我大概知道不能提早交是前端作弊 這部分還能懂

secretfly01/29 01:23不能遲交是怎樣 我使用者也要在五分鐘的瞬間點送出?

secretfly01/29 01:24寫完考卷看到計時器 4:59.59的瞬間去按下去就對了==

kurtsgm01/29 01:25自動送出吧 XDD 強制交卷

secretfly01/29 01:255:00的時候就不允許交卷嗎 這樣誰辦得到 我哪裡搞錯@@

secretfly01/29 01:26哦哦有道理 靠北喔要講清楚啊 感謝解答媽的想老半天

kurtsgm01/29 01:27我是覺得沒啥正常的解法啦 尤其是原po連什麼延遲好幾分鐘

kurtsgm01/29 01:27都想考慮進去

kurtsgm01/29 01:28然後又要假定使用者取得前端的原始碼

kurtsgm01/29 01:29話說如果人家都這麼猛了 你直接給他滿分不行嗎 XDDD

secretfly01/29 01:29笑死 我只覺得原po表達能力可能要再練一下

secretfly01/29 01:57不過原PO思考滿縝密的 做網頁想多點應該算是好事?

secretfly01/29 01:57不過菜雞如我好奇的是偽造繞過計時器 有那麼簡單嗎

secretfly01/29 01:58這跟跳過廣告是不是類似的東西 有沒有相關資料

secretfly01/29 01:59剛好在研究request的東西 滿有興趣了解實作這塊的XDD

guanting88601/29 03:00資料庫記錄比較適合吧,使用者點選開始作答時就記錄

guanting88601/29 03:00這個使用者針對該項課程測驗開始的時間、預估何時結

guanting88601/29 03:00束測驗、前端就只算剩幾分鐘,並且使用者的每一項作

guanting88601/29 03:00答會同步到資料庫內。

guanting88601/29 03:01這樣好處是使用者瀏覽器掛掉、關掉、連線問題 使用

guanting88601/29 03:01者應該還可以回到課程平台去找開測驗繼續做

guanting88601/29 03:06最後不論是否有做完 都還有最後填寫的答案 若一個測

guanting88601/29 03:06驗有30題,使用者填到第28 題電腦或網路有問題 至少

guanting88601/29 03:06可以控制風險讓使用者損失最小

guanting88601/29 03:08若將這種控制存放在session 你作答會被鎖在當下,只

guanting88601/29 03:08要發生任何意外,例如使用私密瀏覽模式時不小心關掉

guanting88601/29 03:08,下次開啟時 使用者的 cookie 的 session id 就變

guanting88601/29 03:08新的,你後端在認的時候就對不上了

luke7201/29 03:59考試都有條文規定,糟糕的網路環境後果自負

luke7201/29 04:00這是法律問題不是技術問題

luke7201/29 04:01而且真正嚴謹的認證考試,是要搭配全程錄影的

RINPE01/29 07:29不能提早交? 時間到會自動送出的意思嗎

k79897686901/29 08:20這很老闆思維 需求都說不清楚

nh60211as01/29 08:53請使用者到實體地點作答

foreverk01/29 09:01工程師想太多不一定是好事,尤其是偏離實際情境太遠,

foreverk01/29 09:01只是增加了系統複雜度,但只解決了很微小的問題

gofigure01/29 13:56你可以允許一個延遲最大值 但不可能太大

gofigure01/29 14:13session可以設置過期 所以不用管前端的timestamp

qrtt101/29 14:56時間差太多,這連 https 都不能正常運作了唄?

DrTech01/29 15:221.機器都辦不到完全精確5分鐘計時。2.如果你預設立場網路

DrTech01/29 15:22會延遲幾分鐘,那麼這個需求根本不合理。 標準的,需求錯

DrTech01/29 15:22誤。

DrTech01/29 15:25拿掉網路會延遲幾分鐘的情況再來討論吧。

DrTech01/29 15:34照這種邏輯,使用者電腦配備都要考量進去了,不然前端執行

DrTech01/29 15:34運算時間不同。何必庸人自擾呢。

DrTech01/29 15:34根本不用抓精確5分鐘,才是現實做法。

airtsubasa01/29 17:26這應該是分兩段 前端五分鐘停止作答(可作弊 停用js等

airtsubasa01/29 17:26) 所以第二段要在作答時寫入時間,送出測驗後超過五

airtsubasa01/29 17:26分的皆為無效測驗 搞那麼複雜幹嘛

OnlyRD01/29 18:27socket timeout ? 其實使用者連線不穩,應該就要拒

OnlyRD01/29 18:27絕操作了,即

OnlyRD01/29 18:27使它超時才提交。到底有什麼應用是連線不穩定還可

OnlyRD01/29 18:27以延時正確提交

OnlyRD01/29 18:27?難不成他一年後重連也ok?感覺需求設計有點問題

OnlyRD01/29 18:27

luke7201/29 19:02我覺得先弄清楚這是什麼等級的考試系統吧,小考還是國考

luke7201/29 19:03學校小考根本不用想這麼多防弊,國考指考一定要進考場

secretfly01/29 19:04這是媲美台北市長線上投票的等級吧

luke7201/29 19:04然後網路延遲最多不就tcp timeout嗎,怎麼到幾分鐘的

secretfly01/29 19:05避免像是某丁那樣 一邊開票一邊投票的選舉無效之術

luke7201/29 19:05還是這個系統不允許超時,卻允許tcp無限重傳?

secretfly01/29 19:05原po的不能遲交 或網路延遲都要考慮進去就合理了(?

luke7201/29 19:08原po說網路延遲千萬別小看阿

WaterLengend01/29 19:12現實來說應該會有個考試中心跟監考人員,要是真的出

WaterLengend01/29 19:12這種網路大掉包,應該是透過例外處理的方法,通知

WaterLengend01/29 19:12考試重來之類的

gmoz01/29 19:50偵測網路延遲過多直接拒絕使用者作答就好

wt01/29 20:15規格需求不夠明確,要回頭討論需求情境跟目的

wt01/29 20:16目前描述下,網路延遲 跟 偽造作弊兩者分不出來

DrTech01/29 21:03如果需求是:確保公平性。結果你只想著:"保證每個人都精

DrTech01/29 21:03確做答五分鐘",顯然是弄錯需求了。

OSDBNetwork01/29 21:45網路延遲的單位是ms . 小到不用考慮這因素 .

OSDBNetwork01/29 21:46https://reurl.cc/KXm00m

OSDBNetwork01/29 21:47通常幾分鐘以上都是網路掛掉了! 不是網路延遲.

superpandal01/29 23:49很神奇的需求 肯定沒辦法簡單解決

superpandal01/29 23:49但可以從做遊戲的方式思考 用心跳和記錄撰寫進度著手

c8dog01/30 01:05如果直接把瀏覽器關掉你要怎麼比對 timestamp? 很明顯堅持

c8dog01/30 01:05要完美比對 timestamp 不是合理做法

endless199901/30 02:00不要有交卷按鈕 五分鐘自動交不行嗎

Phenomenon01/30 09:18每題作答的時候就送到後端,後端超過五分鐘就不給送

Ekmund01/30 10:30假設request會被fake的話代表你protocol都被破了

Ekmund01/30 10:31這個前提就讓前端涼得差不多了吧 XD

knives01/30 10:34要作真的,一定是看後端,永遠都不要相信前端

Ekmund01/30 10:37而且“測驗”+綁session就表示預設使用期間必須保持連線

Ekmund01/30 10:37狀態 這樣考慮延遲單位到以分鐘計不是很怪?

Ekmund01/30 10:38如果要納入這麼極端狀況的用戶 那5分鐘要求就很突兀啦w

Ekmund01/30 10:40感覺是你把需求跟目標族群弄錯了什麼耶

shring01/30 10:53後端延遲送達你要怎麼確認不是偽造的?

vi00024601/30 12:15很簡單 加個驗證碼

vi00024601/30 12:15不過我們這樣回沒什麼用 原po應該要把需求寫詳細點

gmoz01/30 14:18我也覺得原PO過早於糾結怎麼確認5分鐘 先把需求跟背景弄清

gmoz01/30 14:18跟相關承辦或是user 再做多一點的情境確認

MyNion01/30 15:20前端五分整自動送出&跳轉,後端五分七秒後停止接收

MyNion01/30 15:20剩下的設備與網路問題乾我屁事?

MyNion01/30 15:20作答前規則就要聲明清楚,請使用者後果自負

sniper282401/30 17:18確實 自動送出跟檢查一些就沒問題了吧

luke7201/30 18:27自動送出可以disable js停止,寫完再啟動送出,說網路延

luke7201/30 18:27

c8dog01/31 02:04原 PO 比較像是被公司的 PM 嚇到然後無限糾結五分鐘

knives01/31 06:34這肯定是87pm 又在想一些不可能實現的87需求

gtjs4501/31 08:03先搞清楚需求再來問好不好

needy01/31 08:44又一個經典工程師想太多跟現實需求脫節的案例 你假設網路會

needy01/31 08:44延遲幾分鐘? 那要不要假設電腦會當機? 當然系統排除越多

needy01/31 08:44例外狀況越好 但好的工程師要能在技術成本和效果之間做取捨

needy01/31 08:44 絕大部分狀況只需要前端計時就好 確實純前端有有可能被竄

needy01/31 08:44改 但你的測驗情境是面向非專業人士的話 幾乎沒幾個人能辦

needy01/31 08:44到 不然再加上交卷時在後端驗證時間 能應付99.99%的場景

gmoz01/31 10:22先去跟PM說做不到 然後假裝退一步跟他說先求有再求好

ssccg01/31 12:50基本上沒有哪個系統用後端計時,又去容忍前端延遲超過幾秒

ssccg01/31 12:50網路爛你自己家的事,你要不要先確定好這需求真的存在

ssccg01/31 12:53電競遊戲延遲太長就是斷線,容忍延遲時間長到隔壁的都能跑

ssccg01/31 12:57來偷看螢幕再回去操作的還有人要比?

Ekmund01/31 14:43還是會有個一咪咪緩衝當臨界啦...卡buffering/IO還是其他

Ekmund01/31 14:43什麼鬼的 都有可能讓邏輯段在處理到的時候超過那麼幾毫秒

Ekmund01/31 14:44不過頂多就給個幾秒吧

InfinitySA01/31 15:21網路延遲之外 計時本身也會有誤差

InfinitySA01/31 15:22只要不是完全的0誤差 就只能訂一個可接受的範圍

wateryc01/31 15:26很適合當老闆或客戶或pm,提什麼爛需求

stellvia235901/31 16:26需求聽起來很雞掰

alan310001/31 18:28想太多 就算你客制client也一樣會被破解 鑽牛角尖有點笨

alan310001/31 18:31直接server計時5分+10秒當緩衝就夠了

alan310001/31 18:32頂多幫他幾個動作或每15秒自動儲存一次就夠 別想太美好

viper970902/01 00:14推延遲時間長到隔壁都可以偷看XD

imgodd02/01 05:45前後端都做計時,結束時統一用人工驗證