建議使用成熟插件(如 restful_authentication),但必須保持更新。早期版本存在 params[:id] = nil 導致首個已啟用用戶被登入的漏洞:
User.find_by_activation_code(params[:id])
# params[:id]=nil → WHERE activation_code IS NULL → 返回第一個已啟用用戶
Google Mail CSRF 漏洞:誘導受害者載入含 <img src="https://mail.google.com/mail/?ui=2&ik=...&view=fl&ft=...&cf=...&em=attacker@evil.com"> 的頁面,竄改過濾規則轉發郵件。根治:徹查 XSS/CSRF 漏洞。
recaptcha,View 用 recaptcha_tags,Controller 用 verify_recaptcha# Controller 中
filter_parameter_logging :password
# 日誌將顯示 [FILTERED] 而非明文密碼
原則:假設攻擊者取得伺服器完整存取權,日誌不得含明文密碼/信用卡號。
Bruce Schneier 分析 34,000 MySpace 洩露密碼,前 20 名:password1, abc123, myspace1, password, blink182, qwerty1, **you, 123abc, baseball1, football1, 123456, soccer, monkey1, liverpool1, princess1, jordan23, slipknot1, superman1, iloveyou1, monkey。
建議:句子首字母法 —— "The quick brown fox jumps over the lazy dog" → Tqbfjotld。避免知名語錄。
Ruby ^ $ 匹配行首行尾,非字串首尾(應用 \A \z)。
# 危險驗證
validates_format_of :name, :with => /^[\w\.\-\+]+$/
# 繞過: "file.txt%0A" → 換行後內容不被檢查
# 正確
/\A[\w\.\-\+]+\z/
用戶可竄改任何參數(id、隱藏欄位、JS 驗證均可繞過)。
# 危險
@project = Project.find(params[:id])
# 安全:授權查詢
@project = @current_user.projects.find(params[:id])
工具:Firefox Web Developer Toolbar(改隱藏欄位)、Live HTTP Headers(重放/竄改請求)、Client-side proxies(攔截所有流量)。