CSRF(Cross-site request forgery)是一種網(wǎng)絡攻擊手段,攻擊者在用戶不知情的情況下,利用用戶當前的登錄狀態(tài),在用戶的瀏覽器上執(zhí)行惡意操作,比如轉(zhuǎn)賬、修改密碼等。一個常見的防范措施是使用CSRF Token。PHP 提供了一些函數(shù)和類來幫助Web開發(fā)者實現(xiàn)CSRF Token。
首先,我們需要明確什么是CSRF Token。CSRF Token 是一種隨機字符串,用于驗證請求是否來自合法的源。開發(fā)者可以在表單中添加一個隱藏域存儲此Token,此Token會在Web服務端驗證,并在響應時生成新的Token再放到響應的表單中。這樣,攻擊者必須知道當前表單中的Token才能偽造一次有效的請求。
<form method="POST" action="payment.php"> <label>Amount: </label> <input type="text" name="amount" /> <input type="hidden" name="csrf_token" value="隨機字符串" /> <input type="submit" value="Pay Now" /> </form>
PHP 在5.4版本中引入了一個CSRF Token 驗證流程可用的新特性,讓Web開發(fā)者能夠通過一套API輕松地創(chuàng)建和管理CSRF Token。以下是使用PHP自帶的 Token 在表單中添加CSRF Token 的例子:
<form method="POST" action="purchase.php"> ... <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>" /> </form>
Token 會在 $_SESSION 中存儲。在服務端,我們可以使用以下代碼驗證 Token:
session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) { // CSRF Token 不匹配,拋出異常或重定向到錯誤頁面 } }
以上代碼會驗證從 POST 請求中獲取到的 Token 是否與 $_SESSION 中存儲的 Token 匹配。如果不匹配,則拋出異常或重定向到錯誤頁面。Web 開發(fā)者可以按照自己的需求設置 Token 的過期時間,以及支持多個表單的 Token 管理等。
在PHP中, Laravel 和 Symfony 等流行的 PHP Web 框架都提供了 CSRF Token 的實現(xiàn)。在 Laravel 中,可以通過以下代碼來生成 Token,并在表單中添加 CSRF Token:
<form method="POST" action="/payment"> ... {{ csrf_field() }} </form>
在 Symfony 中,則需要在控制器中調(diào)用 TokenStorage 中的 Token Generator 來創(chuàng)建 Token,并在 Response 中返回 Token 和已知道的表單。
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Csrf\CsrfToken; use Symfony\Component\Security\Csrf\TokenGenerator\UriSafeTokenGenerator; function indexAction() { $tokenGenerator = new UriSafeTokenGenerator(); $token = new CsrfToken('authenticate', $tokenGenerator->generateToken()); $form = $this->createFormBuilder(null, [ 'csrf_token_id' =>'authenticate', 'csrf_token' =>$token, ])->add('username', 'text')->add('password', 'password')->add('authenticate', 'submit')->getForm(); $content = $this->renderView('authenticate.html.twig', [ 'form' =>$form->createView(), ]); return new Response($content); }
以上是一些 PHP 中防止 CSRF 攻擊的基本防御方法和一些常用的開源框架的 CSRF Token 的實現(xiàn)。同時,開發(fā)者也可以嘗試添加其他驗證方式或加密技術來增加安全性,例如 TLS 協(xié)議增加 SSL Pinning 增加 Server 態(tài)的認證等。