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

PHP 以 Token 機制辨識正常請求與外部偽造請求 (CSRF 防護)

     編輯:PHP 綜合知識

核心原理

在 Session 中儲存隨機 Token,表單提交時攜帶此 Token,伺服器驗證一致性即可判斷請求來源。若 Token 不符或缺失,視為外部偽造請求 (CSRF)。

完整實作代碼

<?php
session_start();

if (isset($_POST['check']) && !empty($_POST['name'])) {
    if ($_POST['check'] === $_SESSION['check']) {
        echo "正常訪問";
    } else {
        echo "外部訪問";
    }
}

// 產生新 Token 供下一次請求使用
$token = md5(uniqid(rand(), true));
$_SESSION['check'] = $token;
?>
<form method="post" action="">
    <input type="text" name="name" />
    <input type="text" name="check" value="<?=$token;?>">
    <input type="submit">
</form>

關鍵點解析

  • session_start() 必須在輸出前呼叫。
  • Token 使用 md5(uniqid(rand(), true)) 產生高熵值隨機字串。
  • 表單以隱藏欄位或可見欄位攜帶 Token(實務上建議用 <input type="hidden">)。
  • 驗證時嚴格比對 ===,防止型別轉換繞過。
  • 每次請求後重新產生 Token(一次性 Token),進一步提升安全性。

進階建議

  • 將 Token 驗證封裝為中介層或基底 Controller 方法,統一保護所有 POST 端點。
  • 搭配 SameSite=Strict/Lax Cookie 屬性,瀏覽器層面攔截跨站請求。
  • 對於 AJAX 請求,可透過自訂 Header(如 X-CSRF-Token)傳遞 Token。
  • 考慮使用成熟函式庫(如 paragonie/csrf)處理 Token 生命週期與多標籤頁場景。

結語

Token 驗證是防禦 CSRF 最經典有效的手段。上述極簡範例展示核心邏輯,實務專案中請納入統一防護機制,並配合 SameSite Cookie、雙重提交 Cookie 模式等纵深防禦策略。

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