PHP-實例-CSRF

1 需求

按照用途分類:

  • 會話(會話ID和會話令牌 二選一)
    • 會話ID:服務器側自動生成,自動存儲在cookie中,需要在服務器側存儲
    • 會話令牌:服務器側手動生成,手動存儲在cookie中,不需要再服務器側存儲
  • CSRF
    • CSRF令牌:

按照存儲位置分類:

  • 服務器側
    • $_SESSION
  • 瀏覽器側
    • cookie
    • 隱藏控件

2 語法


3 示例

在 PHP 中,防范 CSRF(跨站請求偽造)攻擊的一種常見方法是使用令牌(token)驗證。這個令牌通常是一個隨機生成的字符串,它在表單提交時與用戶的會話(session)相關聯。下面是一個簡單的 PHP 示例,演示了如何防范 CSRF 攻擊:

  1. 生成 CSRF 令牌

在會話開始時,生成一個隨機的 CSRF 令牌并將其存儲在會話中。

session_start();// 生成 CSRF 令牌
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
  1. 在表單中包含 CSRF 令牌

在 HTML 表單中,將 CSRF 令牌作為隱藏字段或作為請求頭的一部分包含在內。

<form action="submit.php" method="post">
<!-- 其他表單字段 --><!-- CSRF 令牌作為隱藏字段 -->
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"><!-- 提交按鈕 -->
<button type="submit">Submit</button>
</form>

或者,你可以使用 JavaScript 將 CSRF 令牌作為請求頭的一部分發送:

// 假設你已經在某處將 CSRF 令牌存儲在 JavaScript 變量中
var csrfToken = '...'; // 從 cookie、localStorage 或其他地方獲取// 使用 AJAX 發送請求時,將 CSRF 令牌作為請求頭的一部分發送
$.ajax({
url: 'submit.php',
type: 'POST',
data: { /* 其他數據 */ },
headers: {
'X-CSRF-Token': csrfToken
},
success: function(response) {
// 處理響應
}
});
  1. 驗證 CSRF 令牌

在服務器端,驗證接收到的 CSRF 令牌是否與會話中的令牌匹配。

session_start();
// 檢查是否提交了 CSRF 令牌
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
// CSRF 令牌驗證成功,處理表單數據
// ...
} else {
// CSRF 令牌驗證失敗,可能是 CSRF 攻擊
// 可以采取相應的措施,如記錄日志、返回錯誤消息等
die('Invalid CSRF token.');
}

如果你使用的是 AJAX 請求并通過請求頭發送 CSRF 令牌,你可以在服務器端通過?$_SERVER['HTTP_X_CSRF_TOKEN']?來獲取它并進行驗證。

請注意,這只是一個簡單的示例,用于說明如何防范 CSRF 攻擊。在實際應用中,你可能還需要考慮其他安全措施,如使用 HTTPS 來加密通信、限制請求的來源等。


4 參考資料

CSRF 令牌(通常稱為 CSRF token)通常是在用戶會話(session)開始時生成,并在整個會話期間保持不變。這意味著,在用戶的單個會話中,CSRF 令牌是唯一的并且相同的,但不同的用戶會話或不同的瀏覽器會話會有不同的 CSRF 令牌。

這是 CSRF 令牌的一個典型實現方式:

  1. 當用戶首次訪問受保護的頁面或應用時,服務器會為該用戶會話生成一個隨機的 CSRF 令牌,并將其存儲在會話數據(如 PHP 的?$_SESSION)中。
  2. 同時,服務器會將這個 CSRF 令牌嵌入到發送到客戶端的頁面中,通常是通過一個隱藏的表單字段或者 cookie。
  3. 當用戶提交表單時,客戶端會將 CSRF 令牌包含在請求中(通常是通過表單字段或自定義的 HTTP 請求頭)。
  4. 服務器在接收到請求時,會檢查請求中的 CSRF 令牌是否與會話數據中的令牌匹配。如果匹配,則繼續處理請求;如果不匹配,則拒絕請求,并可能記錄一個安全事件。

由于 CSRF 令牌是在會話開始時生成的,并且通常在整個會話期間保持不變,因此服務器可以在多個請求之間驗證相同的 CSRF 令牌。這樣可以確保只有知道當前會話 CSRF 令牌的用戶(即同一瀏覽器的同一用戶會話)才能提交有效的表單請求。

然而,值得注意的是,有些實現可能會選擇在每次請求時都生成新的 CSRF 令牌。雖然這可以提供更高的安全性(因為即使 CSRF 令牌在某個時間點被泄露,它也會在很短時間內失效),但它也會增加實現的復雜性,并可能導致一些額外的問題(如需要在多個頁面之間傳遞和同步 CSRF 令牌)。因此,在大多數情況下,每個會話一個 CSRF 令牌是足夠安全的,并且更容易實現和管理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41606.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

7月07日,每日信息差

第一、6 月份&#xff0c;北京、上海、廣州和深圳的新建商品住宅成交量分別環比增加 21%、66%、48% 和 38%&#xff0c;均創年內新高 第二、2024 年世界人工智能大會上&#xff0c;上海向四家企業發放了首批無駕駛人智能網聯汽車示范應用許可&#xff0c;這些企業可以在浦東部…

Redis源碼整體結構

一 前言 Redis源碼研究為什么先介紹整體結構呢?其實也很簡單,作為程序員的,要想對一個項目有快速的認知,對項目整體目錄結構有一個清晰認識,有助于我們更好的了解這個系統。 二 目錄結構 Redis源碼download到本地之后,對應結構如下: 從上面的截圖可以看出,Redis源碼一…

52-5 內網代理2 - LCX端口轉發(不推薦使用LCX)

環境搭建: 本地開3臺虛擬機:kali(必須)、windows2012與2008 (可換成其他windows虛擬機) kali - 網絡配置成橋接模式 windows2012 - 設置兩個網卡,NAT與橋接模式 注意:windows2012要關閉防火墻,要不然其他主機ping不通 關閉防火墻后再開啟遠程桌面連接 windwos20…

去O化神器 Exbase

隨著去O化進程推動&#xff0c;很多舊業務依賴的oracle數據庫&#xff0c;都需要實現做數據庫的替換&#xff0c;當下能很好兼容Oracle&#xff0c;并實現異構數據庫之間轉換的工具并不多。這里給大家推薦一個商業工具數據庫遷移工具exbase&#xff08;北京海量&#xff09;&am…

昇思MindSpore 25天學習打卡營|day18

DCGAN生成漫畫頭像 在下面的教程中&#xff0c;我們將通過示例代碼說明DCGAN網絡如何設置網絡、優化器、如何計算損失函數以及如何初始化模型權重。在本教程中&#xff0c;使用的動漫頭像數據集共有70,171張動漫頭像圖片&#xff0c;圖片大小均為96*96。 GAN基礎原理 這部分原…

想知道你的電腦能不能和如何升級RAM嗎?這里有你想要的一些提示

考慮給你的電腦增加更多的RAM,但不確定從哪里開始?本指南涵蓋了有關升級Windows PC或筆記本電腦中RAM的所有信息。 你需要升級RAM嗎 在深入研究升級RAM的過程之前,評估是否需要升級是至關重要的。你是否經歷過系統滯后、頻繁的BSOD錯誤或應用程序和程序突然崩潰?這些癥狀…

從零開始的python學習生活

pycharm部分好用快捷鍵 變量名的定義 與之前學習過的語言有所不同的是&#xff0c;python中變量名的定義更加的簡潔 such as 整形。浮點型和字符串的定義 money50 haha13.14 gaga"hello"字符串的定義依然是需要加上引號&#xff0c;也不需要寫&#xff1b;了 字符…

Django 常見的操作符

在filter() 方法&#xff0c;exclude() 方法中使用大于&#xff0c;小于&#xff0c;模糊匹配等操作符。 常見的操作符如下&#xff1a; 操作符含義示例等于Book.objects.filter(price10)! 或 __ne不等于用于查找字段不等于特定值的記錄。但更常用exclude()方法。__gt大于用于…

React Redux使用@reduxjs/toolkit的hooks

關于redux的學習過程需要幾個官網&#xff0c;有redux官網&#xff0c;React Redux官網和Redux Toolkit的官網。 其中后者的中文沒有找到&#xff0c;不過其中的使用在React Redux官網的快速入門中有介紹。 現在一般不使用connect借接口了。 對于借助Redux Toolkit的React Redu…

Linux GUN(gcc/g++) 版本升級教程

Linux gcc/g 升級命令: // 查看當前安裝的版本 ll /usr/bin/gcc* ll /usr/bin/g*// 更新源 sudo apt update // 安裝新版本 sudo apt install g-10 gcc-10 // 應用新的版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 sudo update-altern…

【網站推薦】Developer Roadmaps 開發者學習路線

你是否想學習某門技術而苦苦找不到學習路線。本文推薦一個網站&#xff0c;解決學習路徑問題。 roadmap.sh 旨在創建路線圖、指南和其他教育內容&#xff0c;以幫助指導開發人員選擇路徑并指導他們的學習。 技術路線包括了前端后端安卓iosUI設計等內容&#xff0c;一些技術比如…

信息安全三要素

文章目錄 安全三要素 CIA機密性完整性可用性參考資料 安全三要素 CIA 安全三要素&#xff0c;也被稱為信息安全的CIA三要素&#xff0c;是確保信息和系統安全的核心原則。它們分別是&#xff1a; 機密性&#xff08;Confidentiality&#xff09;&#xff1a;保護數據不能泄露…

antdesignvue對話框用戶可移動并縮放

原貼 輕松搞定Ant Design Modal對話框拖拽縮放 - ByteZoneX社區https://www.bytezonex.com/archives/IFRuoJhd.html Ant Design 模態對話框&#xff1a;實現拖拽縮放功能 **子 Ant Design 是一個流行的前端 UI 框架&#xff0c;提供了一系列實用的組件&#xff0c;包括模態對…

ESP32CAM物聯網教學02

ESP32CAM物聯網教學02 物聯網門鎖 小智來到姑姑家門口&#xff0c;按了門鈴&#xff1b;還在公司上班的姑姑用電腦給小智開了門&#xff0c;讓他先進屋休息。小智對物聯網門鎖產生了興趣&#xff1a;什么是物聯網&#xff1f;為什么這么厲害&#xff1f; 初識物聯網 我們在百…

andboxie-Plus - 知名沙盒軟件、支持游戲多開測試軟件

我們經常會需要用到一些毒瘤軟件——它們可能不是真正的惡意軟件&#xff0c;但總愛偷摸干一些流氓行為。 工作中&#xff0c;有時還不得不安裝使用一些來路不明、不能完全信任的可疑軟件。 裝上吧&#xff0c;心里膈應、難受&#xff1b;不裝吧&#xff0c;有些工作又進行不…

代碼隨想錄算法訓練營第五十八天|KMC101 孤島的總面積、KMC102 沉沒孤島、KMC103 水流問題

題1&#xff1a; 指路&#xff1a;101. 孤島的總面積 (kamacoder.com) 思路與代碼&#xff1a; 本題要求找到不靠邊的陸地面積&#xff0c;那么我們從地圖的最外層開始遍歷&#xff0c;找到靠近四個邊的陸地&#xff0c;通過搜索將周邊靠陸地且相鄰的陸地1變成海洋0&#xf…

【驅動篇】龍芯LS2K0300之PWM設備驅動

實驗目的 利用脈沖調制效應&#xff08;PWM&#xff09;等效改變輸出功率大小控制LED&#xff0c;從而實現呼吸燈效果&#xff0c;需要用到RGB LED模塊 模塊連接 IO 插針接口上一共集成了兩路PWM&#xff0c;分別是PWM2和PWM3&#xff0c;對應GPIO88、GPIO89 PWM2和PWM3對…

期末考試結束,老師該如何私發成績?

隨著期末考試的落幕&#xff0c;校園里又恢復了往日的寧靜。然而&#xff0c;對于老師們來說&#xff0c;這并不意味著工作的結束&#xff0c;相反&#xff0c;一系列繁瑣的任務才剛剛開始。 成績單的發放&#xff0c;就是其中一項讓人頭疼的工作。家長們焦急地等待著孩子的考試…

Python程序打包成EXE文件指南

本套課在線學習視頻&#xff08;網盤地址&#xff0c;保存到網盤即可免費觀看&#xff09;&#xff1a; ??https://pan.quark.cn/s/57ba5f313c5b?? 將Python程序打包成可執行文件&#xff08;EXE&#xff09;可以方便用戶在沒有Python環境的計算機上運行程序。本文將詳細…

【Linux】在線求助命令--help,man page , info page

我們知道Linux有很多的命令&#xff0c;那LInux要不要背命令&#xff1f; 答案是背最常用的那些就行了 那有的時候我們想查詢一些命令的詳細用法該怎么辦呢&#xff1f; 這里我給出3種方法 1.--help --help的使用方法很簡單啊 要查詢的命令 --help 我們看個例子 這里我只…