首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Rails Web 安全十大弱點防範實戰:從 XSS、CSRF 到 Session 劫持完整防護指南

     編輯:Java 相關知識

Web 安全不僅是基礎設施層責任,更需從開發初期建立防禦。OWASP Top 10 弱點在 Rails 中的對應防範策略,配合 Rails 2.0 內建機制與最佳實踐。

A1 - Cross Site Scripting (XSS)

攻擊者植入 JavaScript 竊取 Cookie。Rails 2.0 TextHelper#sanitize 改為白名單機制。

防範策略:

  1. View 中使用 h() 跳脫輸出(或 safeERB plugin 自動化)
  2. 啟用白名單 sanitize(Rails 2.0 預設)
  3. BlueCloth/RedCloth 搭配 WhiteList 使用
  4. Rails 1.2.3 前避免 to_json 直接輸出

A2 - Injection Flaws(SQL Injection 為主)

錯誤寫法:

Project.find(:all, :conditions => "name = '#{params[:name]}'")
Project.find(:all, :conditions => "name = '" + params[:name] + "'")

輸入 ' OR 1 -- 導致 SELECT * FROM projects。

正確寫法:

  1. 佔位符:Project.find(:all, :conditions => ["name = ?", params[:name]])
  2. Hash 條件(Rails 1.2+):Project.find(:all, :conditions => { :name => params[:name] })
  3. 查詢邏輯封裝於 Model
  4. 動態 Finder find_by_xxx 本質安全
  5. find_by_sql 參數化亦安全

A3 - Malicious File Execution

Rails 1.1.6 已修復,舊版需打補丁,建議直接升級。

A4 - Insecure Direct Object Reference

避免將 private 方法誤寫為 public,Controller 層級統一異常處理,防止堆疊追蹤洩露內部結構。

A5 - Cross Site Request Forgery (CSRF)

偽裝受信任用戶請求,利用網站對用戶的信任。特徵:依賴用戶身分、利用網站信任、欺騙瀏覽器發送請求。

防範:

  1. 狀態改變操作必須用 POST(GET 會留在 Log/Proxy)
  2. Rails 2.0 表單自動嵌入 Token(protect_from_forgery 預設開啟)
  3. 舊版使用 Csrf_killer plugin

A6 - Information Leakage and Improper Error Handling

統一異常處理,避免堆疊追蹤外洩:

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

A7 - Broken Authentication and Session Management

Session Hijacking(劫持)

網路監聽竊取 Cookie。對策:

  1. SSL 加密:ActionController::Base.session_options[:session_secure] = true
  2. Cookie 附加 User-Agent/IP 驗證
  3. 登入成功 reset_session 產生新 Session(複製 user_id)
  4. 登出/逾時使 Session 無效

Session Fixation(定制攻擊)

攻擊者取得合法 Session ID,強迫受害者使用。Rails 僅接受已生成 ID,但仍可透過 <meta http-equiv=Set-Cookie> 注入。對策:登入時 reset_session。

Session 過期管理

  • Client 端設定可被竄改
  • Server 端定期清理:CGI::Session::ActiveRecordStore::Session.destroy_all(['updated_at < ?', 20.minutes.ago]),配合 Cron
  • 需 created_at 欄位(ActiveRecordStore Migration 更新)
  • 動態過期 plugin 參考:dynamic-session-expiration

A8 - Insecure Cryptographic Storage

  1. 強密碼策略
  2. Log 過濾密碼:filter_parameter_logging "password"
  3. 清除 .mysql_history、.bash_history
  4. 永不儲存明文密碼:
# 註冊
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}--")

A9 - Insecure Communications

  1. 敏感資料強制 SSL
  2. 基礎設施通訊(DB、Web Server)建立於加密傳輸層
  3. 遵循 PCI DSS 標準(信用卡資訊)
  4. Ruby 開啟 SSL:
http = Net::HTTP.new(HOST, PORT)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

A10 - Failure to Restrict URL Access

完善異常處理 + 權限控制。權限 Plugin(Restful_authentication 等)使用前必須安全審計,參考 rorsecurity.info。

補充:Mass Assignment 弱點

@user = User.new(params[:user]) 可能被惡意注入 admin=1。對策:

  • Model 使用 attr_accessible 白名單(Rails 3 推薦)
  • 或 Controller 過濾 params[:user].slice(:name, :email)

總結

Rails 2.0 內建 CSRF Token、白名單 Sanitize、Cookie Session 等機制大幅降低風險,但開發者仍需:參數化查詢、SSL 全站、Session 最小化、密碼雜湊、Log 過濾、Mass Assignment 白名單、統一錯誤頁面。安全是系統工程,非單一框架可包辦。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved