csrf(跨站請求偽造)是一種攻擊方式,攻擊者通過誘導用戶訪問惡意網(wǎng)站,利用瀏覽器自動攜帶認證憑據(jù)發(fā)起非用戶本意的請求。防御csrf的核心在于驗證請求來源合法性并確認用戶主動操作。php中防御csrf的方法主要有:1. 使用csrf Token,在服務端生成隨機token并存儲于Session,嵌入表單隱藏字段,提交時校驗一致性;2. 驗證http referer頭,判斷請求是否來自可信來源,但不能單獨使用;3. 使用samesite Cookie屬性,限制跨站請求攜帶cookie,如設置session.cookie_samesite為lax。此外需注意:不要依賴get請求執(zhí)行敏感操作,不要將token存入cookie,避免長期使用同一token,并確保ajax請求也攜帶token。合理結合token機制、cookie控制和請求來源驗證,能有效降低csrf風險。
在Web開發(fā)中,CSRF(跨站請求偽造)是一種常見的安全攻擊方式。攻擊者通過偽裝成用戶發(fā)送惡意請求,從而執(zhí)行非用戶本意的操作,比如修改密碼、轉賬等。PHP作為廣泛使用的后端語言,也需要重視CSRF的防御機制。防止CSRF的關鍵在于驗證請求來源的合法性,并確保操作是用戶主動發(fā)起的。
什么是CSRF?
CSRF(Cross-Site Request Forgery),中文叫“跨站請求偽造”,指的是攻擊者誘導用戶訪問一個惡意網(wǎng)站,該網(wǎng)站向你正在登錄的應用發(fā)送請求,而你的瀏覽器因為保存了合法的會話信息(如Cookie),自動將請求帶上認證憑據(jù),導致服務器誤以為是你自己發(fā)出的請求。
舉個例子:你在銀行網(wǎng)站登錄后沒退出,然后訪問了一個含有惡意代碼的網(wǎng)頁,這個頁面偷偷向銀行網(wǎng)站發(fā)起轉賬請求,結果錢就被轉走了。
立即學習“PHP免費學習筆記(深入)”;
PHP中如何防御CSRF?
要有效防御CSRF,核心思想是為每個請求加上一個一次性且不可預測的令牌(Token)。只有服務器知道這個令牌的值,并且要求客戶端在提交請求時也必須帶上這個值。這樣就能判斷請求是否來自可信來源。
1. 使用CSRF Token
- 每次生成表單或需要執(zhí)行敏感操作時,服務端生成一個隨機的token并存儲在session中。
- 將該token以隱藏字段的方式嵌入到html表單中。
- 當用戶提交表單時,檢查提交的token與session中的是否一致。
- 如果不一致或缺失,則拒絕請求。
// 生成token if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(50)); } // 表單中加入token字段 echo '<input type="hidden" name="csrf_token" value="' . htmlspecialchars($_SESSION['csrf_token']) . '">'; // 提交時驗證token if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('非法請求'); }
注意:每次提交后應重新生成token,避免token被竊取后重復使用。
2. 驗證HTTP Referer頭
雖然Referer頭可以偽造,但在多數(shù)情況下仍可作為一個輔助手段來判斷請求來源是否合法。例如,只允許來自本站域名的請求。
$allowed_referer = 'https://yourdomain.com'; if (!isset($_SERVER['HTTP_REFERER']) || strpos($_SERVER['HTTP_REFERER'], $allowed_referer) !== 0) { die('請求來源不合法'); }
這種方法不能單獨使用,但可以作為額外一層防護。
3. 使用SameSite Cookie屬性
現(xiàn)代瀏覽器支持設置Cookie的SameSite屬性,它可以限制Cookie在跨站請求時是否會被發(fā)送:
- SameSite=Strict:完全禁止跨站攜帶Cookie。
- SameSite=Lax:允許部分GET請求攜帶Cookie,適用于大多數(shù)場景。
- SameSite=None; Secure:允許跨站攜帶,但必須配合HTTPS使用。
在PHP中可以通過設置session.cookie_samesite選項實現(xiàn):
ini_set('session.cookie_samesite', 'Lax'); session_start();
推薦結合其他方法一起使用,提升安全性。
常見誤區(qū)和注意事項
- 不要依賴GET請求做敏感操作:GET請求容易被圖片標簽、鏈接等觸發(fā),應該用POST/PUT/delete等方法。
- 不要把token放在Cookie里傳回來:這樣容易受到xss攻擊影響。
- 不要長期使用同一個token:建議每次請求都更新token。
- 不要忽視AJAX請求:同樣需要在header或請求體中帶上token。
基本上就這些。防御CSRF的核心在于識別用戶的真實意圖,而不是僅僅依賴身份憑證。合理使用token機制、控制Cookie行為和驗證請求來源,能大大降低被攻擊的風險。