功能分析
核心需求 * 能統計到場人員情況 * 在現場的人可以證明自己在現場 * 不在現場的人不能證明自己在現場 * 系統能夠辨別和記錄收到的證明 * 系統能保存和顯示統計情況一個基本的掃碼簽到系統:
-
訪問指定URL能出來二維碼
- 管理員登陸后才能訪問URL
- 后端產生二維碼
- 二維碼發送到前端
- 二維碼在前端顯示出來
- 二維碼能定時更新
-
掃碼之后能執行一些操作
- 用戶設備掃碼后能發出數據包
- 構造能夠獨特標識用戶身份的數據包
- 數據包能夠自證來源合法
- 后端能接收、處理收到的數據包
- 驗證數據包來源合法性,時效性
- 提取用戶信息
- 增刪數據庫內容,更新簽到情況
- 給用戶的掃碼設備反饋
- 給二維碼頁面反饋
- 用戶設備掃碼后能發出數據包
一個實用的掃碼簽到系統:
- 安全性
- 不可偽造
- 二維碼頁面的訪問控制
- 二維碼的時效性
- 數據包的用戶身份標識
- 難以攻擊
- 數據包清洗
- 來自二維碼頁面的數據包
- 掃碼產生的數據包
- 惡意IP管理
- 數據包清洗
- 不可偽造
- 魯棒性
- 同一管理員多個會話
- 多個管理員多個會話
- 面對大規模請求不丟包
- 用戶體驗
- 二維碼、簽到頁面好看、有趣、多變
- 掃碼后的反饋頁面好看、有趣、多變
- 掃碼后的反饋頁面響應快
- 簽到頁面顯示已簽人數等
- 二維碼附近顯示頁面更新倒計時
- 簽到后可發彈幕,但可能引入更多安全性問題
基礎學習
* python基本語法 * qrcode包的使用 * django工作流程,工程和app的目錄結構 * django前后端數據如何傳輸 * django的基本命令和HttpResponse的構造 * django模板語言的語法 * django模板的編寫和調用 * django中的訪問控制和數據庫操作實現思路
一個基本的掃碼簽到系統: * 訪問指定URL能出來二維碼 * 管理員登陸后才能訪問URL 帶cookie訪問,未登錄則重定向到登錄界面 * 二維碼的產生,傳送和顯示 用qrcode產生指定內容的二維碼。一種思路是后端把圖片寫到文件里,前端去讀取。優點是思路清晰,操作方式經典,看上去好實現;缺點是頁面更新較快,頻繁讀寫不優雅,並且因為對static文件比較懵逼導致在本地調試時圖片路徑搞不清楚,頁面總是顯不出圖。另一種思路是不讀寫文件,而是把二維碼以某種數據結構直接傳給前端。優點是不讀寫磁盤,滿足了有點強迫症的心理,缺點是不知道怎么搞。然后想到ctf里把圖片按base64編碼的小trick,再加上這些二維碼數據量都不大,於是決定就這么干。測試后發現`img=qrcode.make(token);buf=StringIO();img.save(buf);imgdata=bug.getvalue();`后這個imgdata就是個字符串,那就`data=base64.b64encode(imgdata);`一下,用`render()`傳給前端的img作src,即`
to be continued...
- 掃碼之后能執行一些操作
- 用戶設備掃碼后能發出數據包
- 構造能夠獨特標識用戶身份的數據包
- 數據包能夠自證來源合法
- 后端能接收、處理收到的數據包
- 驗證數據包來源合法性,時效性
- 提取用戶信息
- 增刪數據庫內容,更新簽到情況
- 給用戶的掃碼設備反饋
- 給二維碼頁面反饋
- 用戶設備掃碼后能發出數據包
一個實用的掃碼簽到系統:
- 安全性
- 不可偽造
- 二維碼頁面的訪問控制
- 數據包的用戶身份標識
- 難以攻擊
- 數據包清洗
- 來自二維碼頁面的數據包
- 掃碼產生的數據包
- 惡意IP管理
- 數據包清洗
- 不可偽造
- 魯棒性
- 同一管理員多個會話
- 多個管理員多個會話
- 面對大規模請求不丟包
- 用戶體驗
- 二維碼、簽到頁面好好看、有趣、多變
- 掃碼后的反饋頁面好看、有趣、多變
- 掃碼后的反饋頁面響應快
- 簽到頁面顯示已簽人數等
- 二維碼附近顯示頁面更新倒計時
- 簽到后可發彈幕,可能引入更多安全性問題