本文使用同步令牌詳細介紹了PHP 8中的CSRF保護。它解釋了令牌生成,形式嵌入和服務器端驗證。最佳實踐,常見漏洞(例如不正確的令牌處理)和增量集成
防止PHP 8中的跨站點偽造(CSRF)涉及實施強大的機制來驗證該請求源自您的應用程序,而不是來自惡意的第三方網站。最有效的方法是使用同步令牌。這涉及為每個用戶會話生成獨特的,不可預測的令牌,並將其嵌入到服務器的表格中。收到表單提交後,服務器然後驗證提交的令牌是否與存儲在用戶會話中的令牌匹配。如果它們不匹配,請求將被拒絕為潛在的欺詐性。
這是您可以在PHP 8中實施的方法:
random_bytes()
函數是理想的選擇。使用$_SESSION
將令牌存儲在用戶會話中。csrf_token
(或類似的描述性名稱)。$_POST['csrf_token']
)和用戶的會話( $_SESSION['csrf_token']
中檢索令牌)。比較兩個。如果它們是相同的,則該請求可能是合法的。如果不是,請拒絕請求並顯示錯誤消息。<code class="php"><?php session_start(); // Generate CSRF token on first page load if (!isset($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // Example form echo "<form method='post' action='process.php'>"; echo "<input type="'hidden'" name="'csrf_token'" value="'{$_SESSION['csrf_token']}'">"; echo "<input type="'submit'" value="'Submit'">"; echo ""; // process.php session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) { // Process the form data - the request is likely legitimate // ... your code to handle the form submission ... unset($_SESSION['csrf_token']); // good practice to remove token after use } else { // Reject the request - CSRF attack detected die("CSRF attack detected!"); } } ?></code>
請記住,請始終使用HTTP來防止令牌的攔截。
除了簡單地使用同步代幣外,幾種最佳實踐增強了CSRF保護:
HttpOnly
標誌。這樣可以防止客戶端的JavaScript訪問cookie,從而使攻擊者更難竊取令牌。Secure
標誌來確保僅通過HTTPS傳輸。雖然PHP 8本身並未引入專門導致CSRF的新漏洞,但幾種常見的編碼實踐可以使應用程序易受傷害:
將CSRF保護集成到現有項目中。首先關注高風險表格(執行關鍵操作的那些諸如更改密碼,進行財務交易或更新用戶配置文件的操作)。
以上是如何防止PHP 8中的跨站點偽造(CSRF)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!