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

PHP 防禦 CSRF 跨站請求偽造的實用技巧

     編輯:PHP 綜合知識

什麼是 CSRF 攻擊?

跨站請求偽造(CSRF)是一種極具危害性且難以防範的攻擊手段。攻擊者可透過誘導使用者點擊偽造連結、或在不知情下提交隱藏表單,進而竄改資料、發送垃圾訊息、甚至刪除關鍵資料。常見攻擊形式包括:

  • 偽造連結誘騙使用者點擊
  • 隱藏表單偽裝成圖片或連結,誘導使用者提交

主流防禦策略:隨機 Token 驗證

業界通用的低成本防禦方式,是在所有涉及寫入操作的表單中植入一個隨機且頻繁變換的字串,並在後端驗證該字串。若該隨機串與當前使用者身份綁定,攻擊者將難以偽造請求。知名案例包括 Yahoo 表單中的 .crumb、Facebook 的 post_form_id 與 fb_dtsg。

PHP 實作:Crumb Token 類別

以下實作一個可重複使用的 Crumb 類別,採用 HMAC-MD5 產生與驗證 Token,支援自訂有效期(預設 2 小時)與動作區隔:

<?php
class Crumb {
    const SALT = 'your-secret-salt'; // 請替換為專屬密鑰
    static $ttl = 7200; // Token 存活秒數

    static public function challenge($data) {
        return hash_hmac('md5', $data, self::SALT);
    }

    static public function issueCrumb($uid, $action = -1) {
        $i = ceil(time() / self::$ttl);
        return substr(self::challenge($i . $action . $uid), -12, 10);
    }

    static public function verifyCrumb($uid, $crumb, $action = -1) {
        $i = ceil(time() / self::$ttl);
        // 允許當前與前一個時間窗口,避免邊界失效
        if (substr(self::challenge($i . $action . $uid), -12, 10) == $crumb ||
            substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb) {
            return true;
        }
        return false;
    }
}
?>

參數說明: $uid 為使用者唯一識別碼;$ttl 控制 Token 有效時間;$action 可區分不同業務操作(如刪除、發文)。

實際應用範例

1. 表單植入 Token

<form method="post" action="demo.php">
    <input type="hidden" name="crumb" value="<?php echo Crumb::issueCrumb($uid)?>">
    <input type="text" name="content">
    <input type="submit">
</form>

2. 後端驗證邏輯

<?php
if (Crumb::verifyCrumb($uid, $_POST['crumb'])) {
    // Token 通過,執行正常業務流程
} else {
    // Token 驗證失敗,拒絕請求並提示錯誤
}
?>

採用此模式可有效阻擋 CSRF 攻擊,且實作簡單、效能開銷極低。建議在專案中統一封裝為中介層或基礎控制器方法,確保所有寫入操作皆受保護。

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