看板 Soft_Job 關於我們 聯絡資訊
我最近在開發一個「線上測驗」的網頁 前端配合後端PHP 線上測驗的系統要剛好在5分鐘讓使用者作答 不能提早交卷也不能遲交 雖然我可以用前端的JavaScript 計時器計時 不過這樣只能防君子不能防小人 不法人士還是可以透過開發者工具偽造請求繞過網頁的計時器 所以這問題勢必要用後端來解決 我起初的想法是在後端開始出題時先用session記錄當時的timestamp 然後之後當伺服器後端接收到任一請求時,檢查收到時的timestamp跟當初session記錄的 timestamp相減是否剛好為5分鐘 不過這樣又會有另外一個問題 因為網路傳遞請求一定會有延遲 而每次的延遲時間都不同(也會根據使用者網路情況有所差異) 所以不管前端後端好像都無解? 各位有什麼想法嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.12.25.127 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1674909243.A.7C9.html
foreverk: 換個角度思考,有必要到精確到連網路延遲都算進去嗎?01/28 21:00
網路延遲千萬別小看 使用者網路狀況如果真的不好,延遲好幾分鐘都是有可能的
cspy: 設計一個key的演算法 這樣可以避免非合法的送出01/28 21:04
請問key演算法避免非合法送出的原理是什麼 是用非對稱加密法在哪裡加密? 因為在前端加密應該沒什麼意義 不法人士只要知道網頁原始碼就可以非法製造假的key和請求
ssccg: 要算網路延遲看NTP的作法,要避免使用者網路問題就是要多個01/28 21:05
ssccg: 不同地方的server,然後timestamp要簽章01/28 21:06
cspy: 計時的部分還是需要用js去計01/28 21:10
※ 編輯: freebug (39.12.25.127 臺灣), 01/28/2023 21:23:21
ko27tye: 用個心跳包阿 延遲過久就當斷線了 01/28 21:41
WaterLengend: 後端紀錄時間是對的,然後時間一到在後端API會檢查 01/28 21:46
WaterLengend: 超過時間就不能對考試的任何操作進行動作,前端就看 01/28 21:47
WaterLengend: 有沒有動畫或是其他需求要做 01/28 21:47
s06yji3: 網路延遲10分鐘你要算還是不算... 01/28 21:51
foreverk: 我原本以為是毫秒級的網路延遲,如果是分鐘級的,我想 01/28 21:54
foreverk: 關注在改善受測者或是系統的環境,會比關注在演算法好 01/28 21:54
foreverk: 得多吧 01/28 21:54
foreverk: 如果以台灣的網路環境來看,會延遲到分鐘級,除了受測 01/28 21:57
foreverk: 者跑去搭大眾運輸然後剛好過山洞沒訊號外,再來就是ISP 01/28 21:57
foreverk: 瞬斷,那這是要怎麼算XD 01/28 21:57
Hsins: 比較好奇是什麼類型的測驗跟受眾... 需要這麼來防... 01/28 22:01
final01: 黑客大賽?XD 01/28 22:08
vi000246: 延遲應該是無解 01/28 22:09
Lomonosov: 不能提早交卷是認真的嗎? 01/28 22:57
GoalBased: 測驗差個30秒無所謂 01/28 23:00
lovdkkkk: 可以用推文有提到的加密 01/28 23:16
viper9709: 延遲到分鐘級...這個無解吧XD 01/28 23:16
lovdkkkk: 加密演算法可以加鹽,如果是 5 分鐘就用 300 (秒) 當鹽 01/28 23:16
lovdkkkk: 把相關參數跟方法放在開發者工具碰不到的地方, 01/28 23:16
lovdkkkk: 每秒把鹽的參數 +1,送出時資料過個加密到後端, 01/28 23:17
lovdkkkk: 後端解得出來就表示使用者剛好是在 300 秒時按下送出 01/28 23:17
lovdkkkk: 是說到底為什麼不能提早交啊... 01/28 23:17
lovdkkkk: 考試內容包括手速? 要準秒按鈕? 01/28 23:19
lovdkkkk: 寫 timer 時間到自動點送出算違規嗎? 算的話上面也無效 01/28 23:24
MoonCode: 想請教開發者工具碰不到的地方 01/28 23:29
lovdkkkk: 應該說是不能 console 直接改, debugger 還是無法 01/28 23:38
kurtsgm: 把測驗題目全部放canvas裡面 打上時間戳記錄影起來 01/28 23:45
kurtsgm: 五分鐘了不起100~200M吧 ㄎㄎ 01/28 23:49
luweber88: 驗證請求防止他人偽造的方法 01/29 00:22
luweber88: ssr: csrf token with form 01/29 00:22
luweber88: spa: csrf token + samesite cookie 01/29 00:22
luweber88: 將csrf token設為開始時間的雜湊 01/29 00:22
luweber88: 可防止man in middle 但原po是想再防只本人使用其他行 01/29 00:22
luweber88: 為(如爬蟲)的操作嗎? 01/29 00:22
luweber88: 印象中react build過也無法使用開發者工具 把計時模組 01/29 00:25
luweber88: 包成一個小元件ok吧? 01/29 00:25
sp063439: 如果是註冊會員腦袋直覺用 socket 01/29 00:28
s06yji3: 在瀏覽器跑的JS基本都抽的出來吧 01/29 01:01
secretfly: 紅明顯 這是什麼意思 不能提早交也不能遲交? 01/29 01:03
secretfly: 為什麼我看不懂 這人類辦不到的吧 不懂這目的的意思 01/29 01:04
secretfly: 有沒有人能夠白話文說明一下這是在幹嘛?? 01/29 01:04
kurtsgm: 總之就是他要前端不能作弊 後端又能容忍網路延遲幾分鐘 01/29 01:21
kurtsgm: 不偏不倚的剛剛好五分鐘 01/29 01:21
kurtsgm: *不偏不倚剛好五分鐘的"網頁操作時間" 01/29 01:22
secretfly: 我大概知道不能提早交是前端作弊 這部分還能懂 01/29 01:23
secretfly: 不能遲交是怎樣 我使用者也要在五分鐘的瞬間點送出? 01/29 01:23
secretfly: 寫完考卷看到計時器 4:59.59的瞬間去按下去就對了== 01/29 01:24
kurtsgm: 自動送出吧 XDD 強制交卷 01/29 01:25
secretfly: 5:00的時候就不允許交卷嗎 這樣誰辦得到 我哪裡搞錯@@ 01/29 01:25
secretfly: 哦哦有道理 靠北喔要講清楚啊 感謝解答媽的想老半天 01/29 01:26
kurtsgm: 我是覺得沒啥正常的解法啦 尤其是原po連什麼延遲好幾分鐘 01/29 01:27
kurtsgm: 都想考慮進去 01/29 01:27
kurtsgm: 然後又要假定使用者取得前端的原始碼 01/29 01:28
kurtsgm: 話說如果人家都這麼猛了 你直接給他滿分不行嗎 XDDD 01/29 01:29
secretfly: 笑死 我只覺得原po表達能力可能要再練一下 01/29 01:29
secretfly: 不過原PO思考滿縝密的 做網頁想多點應該算是好事? 01/29 01:57
secretfly: 不過菜雞如我好奇的是偽造繞過計時器 有那麼簡單嗎 01/29 01:57
secretfly: 這跟跳過廣告是不是類似的東西 有沒有相關資料 01/29 01:58
secretfly: 剛好在研究request的東西 滿有興趣了解實作這塊的XDD 01/29 01:59
guanting886: 資料庫記錄比較適合吧,使用者點選開始作答時就記錄 01/29 03:00
guanting886: 這個使用者針對該項課程測驗開始的時間、預估何時結 01/29 03:00
guanting886: 束測驗、前端就只算剩幾分鐘,並且使用者的每一項作 01/29 03:00
guanting886: 答會同步到資料庫內。 01/29 03:00
guanting886: 這樣好處是使用者瀏覽器掛掉、關掉、連線問題 使用 01/29 03:01
guanting886: 者應該還可以回到課程平台去找開測驗繼續做 01/29 03:01
guanting886: 最後不論是否有做完 都還有最後填寫的答案 若一個測 01/29 03:06
guanting886: 驗有30題,使用者填到第28 題電腦或網路有問題 至少 01/29 03:06
guanting886: 可以控制風險讓使用者損失最小 01/29 03:06
guanting886: 若將這種控制存放在session 你作答會被鎖在當下,只 01/29 03:08
guanting886: 要發生任何意外,例如使用私密瀏覽模式時不小心關掉 01/29 03:08
guanting886: ,下次開啟時 使用者的 cookie 的 session id 就變 01/29 03:08
guanting886: 新的,你後端在認的時候就對不上了 01/29 03:08
luke72: 考試都有條文規定,糟糕的網路環境後果自負 01/29 03:59
luke72: 這是法律問題不是技術問題 01/29 04:00
luke72: 而且真正嚴謹的認證考試,是要搭配全程錄影的 01/29 04:01
RINPE: 不能提早交? 時間到會自動送出的意思嗎 01/29 07:29
k798976869: 這很老闆思維 需求都說不清楚 01/29 08:20
nh60211as: 請使用者到實體地點作答 01/29 08:53
foreverk: 工程師想太多不一定是好事,尤其是偏離實際情境太遠, 01/29 09:01
foreverk: 只是增加了系統複雜度,但只解決了很微小的問題 01/29 09:01
gofigure: 你可以允許一個延遲最大值 但不可能太大 01/29 13:56
gofigure: session可以設置過期 所以不用管前端的timestamp 01/29 14:13
qrtt1: 時間差太多,這連 https 都不能正常運作了唄? 01/29 14:56
DrTech: 1.機器都辦不到完全精確5分鐘計時。2.如果你預設立場網路 01/29 15:22
DrTech: 會延遲幾分鐘,那麼這個需求根本不合理。 標準的,需求錯 01/29 15:22
DrTech: 誤。 01/29 15:22
DrTech: 拿掉網路會延遲幾分鐘的情況再來討論吧。 01/29 15:25
DrTech: 照這種邏輯,使用者電腦配備都要考量進去了,不然前端執行 01/29 15:34
DrTech: 運算時間不同。何必庸人自擾呢。 01/29 15:34
DrTech: 根本不用抓精確5分鐘,才是現實做法。 01/29 15:34
airtsubasa: 這應該是分兩段 前端五分鐘停止作答(可作弊 停用js等 01/29 17:26
airtsubasa: ) 所以第二段要在作答時寫入時間,送出測驗後超過五 01/29 17:26
airtsubasa: 分的皆為無效測驗 搞那麼複雜幹嘛 01/29 17:26
OnlyRD: socket timeout ? 其實使用者連線不穩,應該就要拒 01/29 18:27
OnlyRD: 絕操作了,即 01/29 18:27
OnlyRD: 使它超時才提交。到底有什麼應用是連線不穩定還可 01/29 18:27
OnlyRD: 以延時正確提交 01/29 18:27
OnlyRD: ?難不成他一年後重連也ok?感覺需求設計有點問題 01/29 18:27
OnlyRD: 。 01/29 18:27
luke72: 我覺得先弄清楚這是什麼等級的考試系統吧,小考還是國考 01/29 19:02
luke72: 學校小考根本不用想這麼多防弊,國考指考一定要進考場 01/29 19:03
secretfly: 這是媲美台北市長線上投票的等級吧 01/29 19:04
luke72: 然後網路延遲最多不就tcp timeout嗎,怎麼到幾分鐘的 01/29 19:04
secretfly: 避免像是某丁那樣 一邊開票一邊投票的選舉無效之術 01/29 19:05
luke72: 還是這個系統不允許超時,卻允許tcp無限重傳? 01/29 19:05
secretfly: 原po的不能遲交 或網路延遲都要考慮進去就合理了(? 01/29 19:05
luke72: 原po說網路延遲千萬別小看阿 01/29 19:08
WaterLengend: 現實來說應該會有個考試中心跟監考人員,要是真的出 01/29 19:12
WaterLengend: 這種網路大掉包,應該是透過例外處理的方法,通知 01/29 19:12
WaterLengend: 考試重來之類的 01/29 19:12
gmoz: 偵測網路延遲過多直接拒絕使用者作答就好 01/29 19:50
wt: 規格需求不夠明確,要回頭討論需求情境跟目的 01/29 20:15
wt: 目前描述下,網路延遲 跟 偽造作弊兩者分不出來 01/29 20:16
DrTech: 如果需求是:確保公平性。結果你只想著:"保證每個人都精 01/29 21:03
DrTech: 確做答五分鐘",顯然是弄錯需求了。 01/29 21:03
OSDBNetwork: 網路延遲的單位是ms . 小到不用考慮這因素 . 01/29 21:45
OSDBNetwork: https://reurl.cc/KXm00m 01/29 21:46
OSDBNetwork: 通常幾分鐘以上都是網路掛掉了! 不是網路延遲. 01/29 21:47
superpandal: 很神奇的需求 肯定沒辦法簡單解決 01/29 23:49
superpandal: 但可以從做遊戲的方式思考 用心跳和記錄撰寫進度著手 01/29 23:49
c8dog: 如果直接把瀏覽器關掉你要怎麼比對 timestamp? 很明顯堅持 01/30 01:05
c8dog: 要完美比對 timestamp 不是合理做法 01/30 01:05
endless1999: 不要有交卷按鈕 五分鐘自動交不行嗎 01/30 02:00
Phenomenon: 每題作答的時候就送到後端,後端超過五分鐘就不給送 01/30 09:18
Ekmund: 假設request會被fake的話代表你protocol都被破了 01/30 10:30
Ekmund: 這個前提就讓前端涼得差不多了吧 XD 01/30 10:31
knives: 要作真的,一定是看後端,永遠都不要相信前端 01/30 10:34
Ekmund: 而且“測驗”+綁session就表示預設使用期間必須保持連線 01/30 10:37
Ekmund: 狀態 這樣考慮延遲單位到以分鐘計不是很怪? 01/30 10:37
Ekmund: 如果要納入這麼極端狀況的用戶 那5分鐘要求就很突兀啦w 01/30 10:38
Ekmund: 感覺是你把需求跟目標族群弄錯了什麼耶 01/30 10:40
shring: 後端延遲送達你要怎麼確認不是偽造的? 01/30 10:53
vi000246: 很簡單 加個驗證碼 01/30 12:15
vi000246: 不過我們這樣回沒什麼用 原po應該要把需求寫詳細點 01/30 12:15
gmoz: 我也覺得原PO過早於糾結怎麼確認5分鐘 先把需求跟背景弄清 01/30 14:18
gmoz: 跟相關承辦或是user 再做多一點的情境確認 01/30 14:18
MyNion: 前端五分整自動送出&跳轉,後端五分七秒後停止接收 01/30 15:20
MyNion: 剩下的設備與網路問題乾我屁事? 01/30 15:20
MyNion: 作答前規則就要聲明清楚,請使用者後果自負 01/30 15:20
sniper2824: 確實 自動送出跟檢查一些就沒問題了吧 01/30 17:18
luke72: 自動送出可以disable js停止,寫完再啟動送出,說網路延 01/30 18:27
luke72: 遲 01/30 18:27
c8dog: 原 PO 比較像是被公司的 PM 嚇到然後無限糾結五分鐘 01/31 02:04
knives: 這肯定是87pm 又在想一些不可能實現的87需求 01/31 06:34
gtjs45: 先搞清楚需求再來問好不好 01/31 08:03
needy: 又一個經典工程師想太多跟現實需求脫節的案例 你假設網路會 01/31 08:44
needy: 延遲幾分鐘? 那要不要假設電腦會當機? 當然系統排除越多 01/31 08:44
needy: 例外狀況越好 但好的工程師要能在技術成本和效果之間做取捨 01/31 08:44
needy: 絕大部分狀況只需要前端計時就好 確實純前端有有可能被竄 01/31 08:44
needy: 改 但你的測驗情境是面向非專業人士的話 幾乎沒幾個人能辦 01/31 08:44
needy: 到 不然再加上交卷時在後端驗證時間 能應付99.99%的場景 01/31 08:44
gmoz: 先去跟PM說做不到 然後假裝退一步跟他說先求有再求好 01/31 10:22
ssccg: 基本上沒有哪個系統用後端計時,又去容忍前端延遲超過幾秒 01/31 12:50
ssccg: 網路爛你自己家的事,你要不要先確定好這需求真的存在 01/31 12:50
ssccg: 電競遊戲延遲太長就是斷線,容忍延遲時間長到隔壁的都能跑 01/31 12:53
ssccg: 來偷看螢幕再回去操作的還有人要比? 01/31 12:57
Ekmund: 還是會有個一咪咪緩衝當臨界啦...卡buffering/IO還是其他 01/31 14:43
Ekmund: 什麼鬼的 都有可能讓邏輯段在處理到的時候超過那麼幾毫秒 01/31 14:43
Ekmund: 不過頂多就給個幾秒吧 01/31 14:44
InfinitySA: 網路延遲之外 計時本身也會有誤差 01/31 15:21
InfinitySA: 只要不是完全的0誤差 就只能訂一個可接受的範圍 01/31 15:22
wateryc: 很適合當老闆或客戶或pm,提什麼爛需求 01/31 15:26
stellvia2359: 需求聽起來很雞掰 01/31 16:26
alan3100: 想太多 就算你客制client也一樣會被破解 鑽牛角尖有點笨 01/31 18:28
alan3100: 直接server計時5分+10秒當緩衝就夠了 01/31 18:31
alan3100: 頂多幫他幾個動作或每15秒自動儲存一次就夠 別想太美好 01/31 18:32
viper9709: 推延遲時間長到隔壁都可以偷看XD 02/01 00:14
imgodd: 前後端都做計時,結束時統一用人工驗證 02/01 05:45
honestyer: 要是他五分鐘內就破解你的東西了 你還不給他過嗎?? 02/01 14:35
wheateardoll: 這麼奇怪的要求,搞不好是政府的案子? 02/02 08:01
ZincAllure: 不能提早不能遲交是什麼意思 要剛好5分鐘的那一秒交嗎 02/02 11:17
roy2142: 是什麼情境網路會延遲到好幾分鐘 03/07 01:05