前幾天看到一篇文章，裡面有提到在駭客年會上有個議程談論了 Ruby on Rails 的安全問題，我讀了一遍投影片，做出了以下的心得整理：
(這是我的心得)用 open source 的 framework 是兩面刃，你可以從程式碼中學到一些設計理念，覺得它不夠好的地方行有餘力還可以自行修改，不過，若是這個 framework 有一些漏洞，那有心人士一樣可以參考程式碼來進行攻擊，所以要嘛就勤奮地作 patch，不然就是要學會一點隱匿方法。
再來就是 Rails project 的 public 目錄下有太多的範本，如 400.html 或 500.html ，如果看到這樣的畫面：
很難說這不是 Rails web 吧 XD！
再來就是很多人在部署(deploy) Rails web 時，多半會使用 Capistrano 之類的工具，或是自己手動用版本控制工具（如：svn），這樣都會在 server 上留下 .svn/ 的目錄，要是有心人士去 access 這些目錄，你的 web 就被看光光啦！所以可以在 .htaccess 或其它存取控制的設定中，把 .svn/ 這個目錄給 deny 掉。
這個部份其實是告訴你，Rails 預設處理 session 的方式沒有很安全，所以重要的資訊千萬不可以放在 session 裡面，也因為大家都可以從 Rails source 中看出 session 是怎麼算出來的，而且 Rails 2.0 預設又是把 session 存在 cookie 裡面，有心的人就可以偽裝 session data 來進行攻擊。
所以，要嘛就在 application.rb 設一個強度較強的 secret_key，不然就是每個一段時間就 invalidate session 資料，再不然就是使用別的方式來處理 session。
這個應該已經是老梗了，不過講者還是提醒大家要記得用 h() 來過濾掉使用者輸入的 HTML code。如果你容易忘掉使用 h() 的話，那就為你的 Rails web 安裝一個 safe_erb 的 plugin 吧！它會在你沒有把 HTML 內容 escape 掉時丟出 exception。
這裡是要提醒你，當使用者登入或登出時，別忘了使用 reset_session 以避免有不同的使用者用到了相同的 session id。
都很老梗，不用多介紹了。
這部份是說，Rails 裡用 ActiveRecord 的 instance 來表示一筆資料庫 record，而對這個 obj 成員變數作 assignment 就相當於去改變這個 record 的值，不過這些成員變數預設都是 public accessible 的，如果裡面有一些重要的欄位，可能會不小心被人家修改到。如：你提供了一個 /user/update 的 action，然後被攻擊者偷帶一些參數試圖修改，這就不太妙了。
所以講者希望在使用 AR 時，能利用 attr_protected 來對成員變數的存取控制做一些管理。