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

Rails 安全指南(二):CSRF 跨站請求偽造原理與防禦

     編輯:Java 相關知識

第 3 章:CSRF 攻擊機制

利用瀏覽器自動攜帶 Cookie特性,誘導已登入用戶向信任站點發送偽造請求。

攻擊流程

  1. Bob 瀏覽駭客論壇,頁面含 <img src="https://webapp.com/project/1/destroy">
  2. Bob 在 webapp.com Session 仍有效(未登出)
  3. 瀏覽器載入圖片 → 自動發送 Cookie → 驗證通過 → 專案被刪除
  4. Bob 事後發現專案消失

關鍵:惡意標籤可置於任何域名(論壇、部落格、郵件)。

3.1 CSRF 核心對策

第一層:正確使用 HTTP 動詞(W3C 標準)

GET查詢、讀取、安全操作、冪等
POST狀態變更、訂閱、用戶負責結果
# Controller 限制動詞
verify :method => :post, :only => [:transfer], :redirect_to => {:action => :list}

圖片標籤只發 GET → 此層防護有效。

第二層:Non-GET 請求強制 Security Token

攻擊者可動態建構 POST 表單:

<a href="https://harmless.com/" onclick="
  var f = document.createElement('form');
  f.style.display = 'none';
  this.parentNode.appendChild(f);
  f.method = 'POST';
  f.action = 'https://example.com/account/destroy';
  f.submit();
  return false;">無害問卷</a>

或 onmouseover、AJAX 背景發送。根治:Server-side Token 驗證。

Rails 2.x 內建防護

# ApplicationController
protect_from_forgery :secret => "123456789012345678901234567890..."
# CookieStore 不需 secret
  • 自動在表單/AJAX 注入 authenticity_token(基於 Session + Secret 計算)
  • 驗證失敗拋出 ActionController::InvalidAuthenticityToken

關鍵警示:XSS 繞過所有 CSRF 防護

XSS 可讀取頁面任意元素 → 竊取 Token 或直接提交表單。XSS 防護是 CSRF 防護的前提。

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