會員與登入系統要點:devise / robots.txt


#1

單純最近遇到一些人的作品有這類的問題 … 所以特別寫篇文章出來( A … 還不乏有玩 Rails 很久的人|| ,人數 > 3 )

首先,請愛用 devise,或是任何一套 gem 來做登入系統,不要自幹 … 除非你自幹的東西能滿足以下條件

  1. A和B使用Z帳號進行登入,A把Z帳號密碼變更,B需登出
  2. E-Mail 密碼通知信 => 驗證啟動碼
  3. 忘記密碼功能 => 發 Email 寄送變更密碼信
  4. 密碼使用 HMAC 加密,同 hash + slat,且能自訂 encrypt key,登入 token 同時也必須使用 encrypt key
  5. 隨便再加上一兩個 gem 就可以支援 OAuth 整套登入流程

…族繁下略,如果沒有辦法自幹的話,請使用 devise 或其他類似的 gem 來完成,因為線上有名的 gem 每天都有人在審閱他的原始碼,甚至做出很多的調整,但你寫的 code 基本上就只有你在看,會發生的漏洞可想而知,anyway 我不希望我的朋友的網站出現在這邊

還有這邊

http://vulreport.net/

再來是 model 設計的問題,你不應該在 User 這個 model 上面增加 is_admin / level 之類的 column 來判斷是否為管理員,因為會讓攻擊者"很方便",只需攻擊登入入口點就可以得到後台權限,且該入口還每個人都知道,類似我知道某個人一定是管理員,取得 mail 後就想辦法攻擊該帳號的密碼即可,風險為 N 使用者對 N 管理員,使用者越多風險越高,且某天系統更新錯誤還會把每個人都變成 admin ,這樣設計非常蠢

你應該增加一個叫 Manager 的 model 來存放管理員,且登入入口與一般使用者切開( 可配合下面管理介面的 route ),除非入口被找到否則無法登入,且 User table 亂更新到也不會隨便把人變成管理者,還可以把登入入口做 IP 限制之類的手法來與 public area 隔離 … 風險就會降為只有 M 個管理員,風險和使用者無關

再來,後台網址應該要建立在某個隱藏網址的後面,用的是 robots.txt 這個檔案,這東西很多地方都有教學,類似

Rails有幫你內建,在 public 下,但請增加你要的,這邊直接舉例最後的結果

/dashboard/                 #使用者後台網址
/dashboard/qazrfvyhnqwecvb  #管理者後台網址

robots.txt 內容為

User-agent: *
Disallow: /dashboard
Allow: /

首先,admin 的網址應該建構在一個不對外的網址下,且該不對外網址是合法的,類似上面的 demo 是一般使用者的後台( /dashboard ),這樣你就可以在 robots.txt 上設定該不對外網址,而隱藏這網址之後的所有的東西,再來是請用亂碼,而非 admin / cpanal / administrator / manager … 這種常用字,因為字典檔測試一定是你腦中想得到的單字就是,最後,robots.txt 一定要加,否則哪天用 Google 就能找到你家後台網址 … 一切都很可笑的

最後是 controller 的繼承,這個在之後的教學有才是,不過那邊單純屬於方便使用的部分了,以上