驗證碼安全基礎
常見的驗證碼問題:
問題一:驗證碼是否出現的判斷邏輯放在客戶端瀏覽器
有些系統預設不顯示驗證碼,而是在使用者校驗錯誤一定次數之後再出現。 那如何判斷使用者已經錯誤幾次了呢?沒有經驗的開發可能這樣做: 在cookie中寫入一個標記,比如loginErr = 1,後續錯誤累加 在session中寫入一個標記,例如loginErr = 1,後續錯誤累加 問題在於,要是惡意訪問者不帶Cookie提交HTTP請求呢?或者不更新Cookie中的loginErr的值反覆提交呢?
程式因為無從獲取Cookie/sessionID,會認為使用者是首次訪問。無論什麼時候,驗證碼都不會出現!
問題二:驗證碼不過期,單個驗證碼反覆可用
多數時候,驗證碼在web伺服器上對應一個session值。
如果完成一次校驗,不標記這個session已失效,就會造成同一驗證碼反覆可用。
此時,驗證碼將不再有用。
惡意訪問者在cookie中帶固定的sessionID和固定的一個驗證碼字串,即可輕鬆爆破。
還有一種很常見的程式碼實現,更新session的工作是通過重新下載驗證碼達到的。
而開發人員容易犯的一個失誤,是把更新session的任務交給客戶端瀏覽器。
比如302重定向,甚至是通過js、meta refresh重定向頁面,來引導使用者重新下載驗證碼。
這些做法實際是錯誤的,要是使用者攔截了重定向,沒有發出新的下載請求呢? 這樣,上次的驗證碼是否還可以使用?
基本的認知是:一個驗證碼,只能使用一次。使用之後,立即過期,不可再次使用。
問題三:將驗證碼內容輸出到客戶端
無論出於什麼考慮,都不應該把驗證碼的內容傳送到客戶端cookie、或輸出到response headers的其他欄位。
比如,寫入驗證碼的MD5值、 Base64轉碼等,太容易被逆向破解,得到原值。
即便是加固定salt後輸出,都是很不好的。
問題四:驗證碼太弱
一般,出現邏輯錯誤的驗證碼,同樣存在太弱的通病,使用開源的tessertact OCR引擎,不經任何訓練,不人工去噪處理,也能識別網際網路上的大部分驗證碼!
相關文章
- 驗證碼基礎(小遊戲型別)遊戲型別
- MVC驗證01-基礎、遠端驗證MVC
- 5.3. 驗證 Seam安全中的驗證特性是基於JAAS
- Oracle基礎結構之OS驗證和口令檔案驗證Oracle
- 網站漏洞檢測 身份驗證碼與重要操作驗證碼安全問題網站
- Thinkphp5基礎——11 validate驗證PHP
- php短視訊原始碼,兩種基礎的滑塊元件驗證PHP原始碼元件
- 行為驗證碼安全策略設定
- JS 基礎篇(策略模式-表單驗證案例)JS模式
- 驗證碼原理及驗證
- 驗證碼---js重新整理驗證碼JS
- Sql語句密碼驗證安全漏洞(轉)SQL密碼
- Linux基礎命令---驗證組檔案grpckLinuxRPC
- 安全基礎-A
- java安全編碼指南之:基礎篇Java
- JavaScript驗證碼生成和驗證效果JavaScript
- 驗證碼機制之驗證碼重複使用
- 無密碼身份驗證:安全、簡單且部署快速密碼
- 基礎實驗
- Laravel - 驗證碼Laravel
- PHP驗證碼PHP
- 驗證碼程式
- 零基礎如何製作易語言網路驗證註冊碼系統?
- Web安全基礎Web
- 安全基礎-E
- 安全基礎-C
- 影片直播app原始碼,傳送驗證碼 驗證碼識別APP原始碼
- PHP 驗證身份證號碼PHP
- 後端安全驗證過程後端
- zk原始碼閱讀9:資料模型ACL之基礎資料結構以及驗證原始碼模型資料結構
- 基於 CNN 的驗證碼破解實戰專案CNN
- 基於Node.js實現行為驗證碼Node.js
- 【驗證碼逆向專欄】某驗“初代”滑塊驗證碼逆向分析
- 精確驗證身份證號碼程式碼
- 隨機驗證碼隨機
- django 驗證碼框架Django框架
- laravel(五) 驗證碼Laravel
- Laravel - 驗證碼(captcha)LaravelAPT