Web 安全不僅是基礎設施層責任,更需從開發初期建立防禦。OWASP Top 10 弱點在 Rails 中的對應防範策略,配合 Rails 2.0 內建機制與最佳實踐。
攻擊者植入 JavaScript 竊取 Cookie。Rails 2.0 TextHelper#sanitize 改為白名單機制。
防範策略:
h() 跳脫輸出(或 safeERB plugin 自動化)sanitize(Rails 2.0 預設)to_json 直接輸出錯誤寫法:
Project.find(:all, :conditions => "name = '#{params[:name]}'")
Project.find(:all, :conditions => "name = '" + params[:name] + "'")
輸入 ' OR 1 -- 導致 SELECT * FROM projects。
正確寫法:
Project.find(:all, :conditions => ["name = ?", params[:name]])Project.find(:all, :conditions => { :name => params[:name] })find_by_xxx 本質安全find_by_sql 參數化亦安全Rails 1.1.6 已修復,舊版需打補丁,建議直接升級。
避免將 private 方法誤寫為 public,Controller 層級統一異常處理,防止堆疊追蹤洩露內部結構。
偽裝受信任用戶請求,利用網站對用戶的信任。特徵:依賴用戶身分、利用網站信任、欺騙瀏覽器發送請求。
防範:
protect_from_forgery 預設開啟)Csrf_killer plugin統一異常處理,避免堆疊追蹤外洩:
def rescue_action_in_public(exception)
case exception.class.name
when 'ActiveRecord::RecordNotFound', 'ActionController::UnknownAction', 'ActionController::RoutingError'
render :file => "#{RAILS_ROOT}/public/404.html", :status => "404"
else
render :file => "#{RAILS_ROOT}/public/500.html", :status => "500"
end
end
網路監聽竊取 Cookie。對策:
ActionController::Base.session_options[:session_secure] = truereset_session 產生新 Session(複製 user_id)攻擊者取得合法 Session ID,強迫受害者使用。Rails 僅接受已生成 ID,但仍可透過 <meta http-equiv=Set-Cookie> 注入。對策:登入時 reset_session。
CGI::Session::ActiveRecordStore::Session.destroy_all(['updated_at < ?', 20.minutes.ago]),配合 Croncreated_at 欄位(ActiveRecordStore Migration 更新)dynamic-session-expirationfilter_parameter_logging "password".mysql_history、.bash_history# 註冊
self.salt = Digest::SHA1.hexdigest("--#{Time.now}--#{login}--")
self.crypted_password = Digest::SHA1.hexdigest("--#{salt}--#{password}--")
# 登入驗證
self.crypted_password == Digest::SHA1.hexdigest("--#{self.salt}--#{user_entered_password}--")
http = Net::HTTP.new(HOST, PORT)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
完善異常處理 + 權限控制。權限 Plugin(Restful_authentication 等)使用前必須安全審計,參考 rorsecurity.info。
@user = User.new(params[:user]) 可能被惡意注入 admin=1。對策:
attr_accessible 白名單(Rails 3 推薦)params[:user].slice(:name, :email)Rails 2.0 內建 CSRF Token、白名單 Sanitize、Cookie Session 等機制大幅降低風險,但開發者仍需:參數化查詢、SSL 全站、Session 最小化、密碼雜湊、Log 過濾、Mass Assignment 白名單、統一錯誤頁面。安全是系統工程,非單一框架可包辦。