Django框架之csrf跨站請求

目錄

一、csrf跨站請求偽造詳解????????

二、csrf跨域請求偽造

【1】正常服務端

【2】釣魚服務端

三、csrf校驗

【介紹】

form表單中進行csrf校驗:

【1】form表單如何校驗

【2】ajax如何校驗

四、csrf相關裝飾器

【1】csrf_protect裝飾器:

【2】csrf_exempt裝飾器:

【3】FBV中使用上述裝飾器

【4】CBV中使用上述裝飾器

(1)??csrf_protect

(2)??csrf_exempt方法


一、csrf跨站請求偽造詳解????????

  • CSRF(Cross-Site Request Forgery)跨站請求偽造是一種常見的網絡攻擊方式。
  • 攻擊者通過誘導受害者訪問惡意網站或點擊惡意鏈接
    • 將惡意請求發送到目標網站上
    • 利用受害者在目標網站中已登錄的身份來執行某些操作
    • 從而達到攻擊的目的。
  • 舉個例子
    • 假設受害者在一家網銀網站上登錄賬戶,然后繼續瀏覽其他網頁。
    • 同時,攻擊者通過電子郵件等方式向受害者發送了一封包含惡意鏈接的郵件。
    • 當受害者點擊該鏈接時,潛在的威脅就會變得非常現實。
    • 該鏈接指向一個由攻擊者操縱的網站,該網站上的惡意代碼會自動向網銀網站發送一個請求,請求轉賬到攻擊者的賬戶。
    • 由于受害者在網銀網站中已經登錄,所以該請求會被認為是合法的,這樣攻擊者就可以成功地進行轉賬操作。
  • 要保護自己免受CSRF攻擊,網站開發者可以采取以下措施:
    • 使用CSRF令牌:
      • 在用戶的請求中添加隨機生成的令牌,并將該令牌保存在用戶會話中。
      • 每次提交請求時都會驗證該令牌,以確保請求是合法的。
    • 啟用SameSite屬性:
      • 將Cookie的SameSite屬性設置為Strict或Lax,以限制跨站請求。
      • 這可以在一定程度上緩解CSRF攻擊。
    • 嚴格驗證請求來源:
      • 服務器端可以驗證請求的來源是否為預期的網站域名
      • 例如檢查HTTP Referer頭部。
    • 使用驗證碼:
      • 在敏感操作(如轉賬、更改密碼等)上使用驗證碼
      • 增加用戶身份驗證的防護。

二、csrf跨域請求偽造

  • 釣魚網站
    • 搭建一個類似正規網站的頁面
    • 用戶點擊網站鏈接,給某個用戶打錢
    • 打錢的操作確確實實提交給了中國銀行的系統,用戶的錢也確實減少
    • 但是唯一不同的是,賬戶打錢的賬戶不是用戶想要打錢的目標賬戶,變成了其他用戶
  • 內部本質
    • 在釣魚網站的頁面針對對方賬戶,只給用戶提供一個沒有name屬性的普通input框
    • 然后在內部隱藏一個已經寫好帶有name屬性的input框
  • 如何避免上面的問題
    • csrf跨域請求偽造校驗
      • 網站在給用戶返回一個具有提交數據功能的頁面的時候會給這個頁面加一個唯一標識
      • 當這個頁面后端發送post請求的時候,我們后端會先校驗唯一標識
        • 如果成功則正常執行
        • 如果唯一標識不符合則拒絕連接(403 forbidden)

【1】正常服務端

  • 前端
<h1>這是正規的網站</h1><form action="" method="post"><p>當前賬戶 :>>>> <input type="text" name="start_user"></p><p>目標賬戶 :>>>> <input type="text" name="end_user"></p><p>轉賬金額 :>>>> <input type="text" name="money"></p><input type="submit">
</form>
  • 后端?
def transform_normal(request):if request.method == "POST":user_start = request.POST.get("start_user")user_end = request.POST.get("end_user")money = request.POST.get("money")return HttpResponse(f"當前賬戶 :>>> {user_start} 向目標用戶 :>>> {user_end} 轉賬了 :>>> {money}")return render(request, 'transform_normal.html')

?【2】釣魚服務端

  • 前端
<h1>這是釣魚的網站</h1><form action="http://127.0.0.1:8000/transform_normal/" method="post"><p>當前賬戶 :>>>> <input type="text" name="start_user" ></p><p>目標賬戶 :>>>> <input type="text"></p><p><input type="text" name="end_user" value="Hopes" style="display: none"></p><p>轉賬金額 :>>>> <input type="text" name="money"></p><input type="submit">
</form>
  • 后端
def transform_normal(request):if request.method == "POST":user_start = request.POST.get("start_user")user_end = request.POST.get("end_user")money = request.POST.get("money")return HttpResponse(f"當前賬戶 :>>> {user_start} 向目標用戶 :>>> {user_end} 轉賬了 :>>> {money}")return render(request, 'transform_normal.html')

三、csrf校驗

【介紹】

  • csrf校驗是一種用于防止跨站請求偽造(Cross-Site Request Forgery)攻擊的安全措施

form表單中進行csrf校驗:

添加CSRF Token字段:

  • 在form表單中添加一個隱藏字段,用于存儲CSRF Token的值。
  • 后端服務器在渲染表單時生成一個CSRF Token,并將其存儲在會話中或者以其他方式關聯到當前用戶。
  • 當用戶提交表單時,前端將CSRF Token的值包含在請求中。
  • 后端在驗證表單數據時,檢查請求中的CSRF Token是否與存儲的Token匹配,如果不匹配,則拒絕請求。

設置Cookie:

  • 后端服務器在渲染表單時,在客戶端設置一個包含隨機生成的CSRF Token的Cookie。
  • 當用戶提交表單時,表單數據會被一同發送到服務器,并自動包含該Cookie。
  • 后端在驗證表單數據時,檢查請求中的CSRF Token是否與Cookie中的值匹配,如果不匹配,則拒絕請求。

雙重Cookie校驗:

  • 后端服務器在渲染表單時,在Cookie中設置一個隨機生成的CSRF Token,并將其存儲在會話中或以其他方式關聯到當前用戶。
  • 當用戶提交表單時,表單數據會被一同發送到服務器,請求頭或請求參數中攜帶一個包含CSRF Token的自定義字段。
  • 后端在驗證表單數據時,同時檢查請求中的CSRF Token和Cookie中的值是否匹配,如果不匹配,則拒絕請求。

【1】form表單如何校驗

  • 在form表單上面加上csrf_token
{% csrf_token %}
<form action="" method="post"><p>username:<input type="text" name="username"></p><p>transfer_user<input type="password" name="password"></p><p>money<input type="text" name="money"></p><input type="submit">
</form>
  • 在頁面標簽中會自動出現一個標簽
<input type="hidden" name="csrfmiddlewaretoken" value="zQaNPZsy1tVmLdqC7GIDOOOfR7yT9YfO58lJ5yrjZfTw2edZTrVYUllOVMnkwXKe">

【2】ajax如何校驗

  • 方式一
    • 利用標簽查找獲取頁面上的隨機字符串
    • 鍵必須叫?csrfmiddlewaretoken
<button id="b1">ajax請求提交</button><script>$("#b1").click(function () {$.ajax({url: '',type: 'post',// (1) 利用標簽查找獲取頁面上的隨機字符串data: {"username": "dream","csrfmiddlewaretoken":$('[csrfmiddlewaretoken]').val()},success: function () {}})})
</script>
  • 方式二
    • 利用模板語法進行快捷引入
<button id="b1">ajax請求提交</button><script>$("#b1").click(function () {$.ajax({url: '',type: 'post',// (2) 利用模板語法提供的快捷書寫data: {"username": "dream", "csrfmiddlewaretoken": "{{ csrf_token }}"},success: function () {}})})
</script>
  • 方式三
    • 定義一個js文件并引入
    • 導入該配置文件之前,需要先導入jQuery,因為這個配置文件內的內容是基于jQuery來實現的
function getCookie(name) {var cookieValue = null;if (document.cookie && document.cookie !== '') {var cookies = document.cookie.split(';');for (var i = 0; i < cookies.length; i++) {var cookie = jQuery.trim(cookies[i]);// Does this cookie string begin with the name we want?if (cookie.substring(0, name.length + 1) === (name + '=')) {cookieValue = decodeURIComponent(cookie.substring(name.length + 1));break;}}}return cookieValue;
}
var csrftoken = getCookie('csrftoken');function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}$.ajaxSetup({beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}
});
<button id="b1">ajax請求提交</button><script>$("#b1").click(function () {$.ajax({url: '',type: 'post',// (3) 定義外部js文件并引入到本地data: {"username": "dream"},success: function () {}})})
</script>

四、csrf相關裝飾器

  1. 網站整體部分校驗csrf,部分不校驗csrf
  2. 網站整體全部校驗csrf,部分不校驗csrf

【1】csrf_protect裝飾器:

  • csrf_protect裝飾器用于需要進行CSRF保護的視圖函數或類視圖。
  • 當一個視圖被csrf_protect裝飾器修飾時,Django會對該視圖接收到的所有POST、PUT、DELETE等非安全HTTP方法的請求進行CSRF校驗。
  • 如果請求中沒有有效的CSRF令牌或令牌校驗失敗,Django將返回403 Forbidden響應。

【2】csrf_exempt裝飾器:

  • csrf_exempt裝飾器用于不需要進行CSRF保護的視圖函數或類視圖。
  • 當一個視圖被csrf_exempt裝飾器修飾時,Django將不會對該視圖接收到的任何請求進行CSRF校驗。
  • 這個裝飾器主要用于一些特殊情況,比如與第三方系統進行集成、開放API接口等。

【3】FBV中使用上述裝飾器

from django.views.decorators.csrf import csrf_protect, csrf_exempt
'''
csrf_protect  需要校驗
csrf_exempt   忽視校驗
'''
  • 當我們沒有注釋掉csrf校驗中間件的時候,可以在函數頭上加上?@csrf_exempt?忽視校驗

  • 當我們注釋掉csrf校驗中間件的時候,可以在函數頭上加上?@csrf_protect?強制啟動校驗

【4】CBV中使用上述裝飾器

from django.views.decorators.csrf import csrf_protect, csrf_exempt
'''
csrf_protect  需要校驗針對 csrf_protect 符合之前的裝飾器的三種用法
csrf_exempt   忽視校驗針對 csrf_exempt 只能給 dispatch 方法加才有效
'''

(1)??csrf_protect

  • (1) 方式一
    • 給指定方法加@method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decoratorclass MyCsrf(View):def get(self, request):return HttpResponse("get")@method_decorator(csrf_protect)def post(self, request):return HttpResponse("post")
  • (2) 方式二
    • 給類加然后指明方法?@method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decorator@method_decorator(csrf_protect)
class MyCsrf(View):def get(self, request):return HttpResponse("get")def post(self, request):return HttpResponse("post")
  • (3) 方式三
    • 重寫?dispatch?方法
from django.views import View
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decoratorclass MyCsrf(View):@method_decorator(csrf_protect)def dispatch(self, request, *args, **kwargs):return super(MyCsrf, self).dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse("get")def post(self, request):return HttpResponse("post")

(2)??csrf_exempt方法

  • 只有重寫?dispatch方法 有效
from django.views import View
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decoratorclass MyCsrf(View):@method_decorator(csrf_exempt)def dispatch(self, request, *args, **kwargs):return super(MyCsrf, self).dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse("get")def post(self, request):return HttpResponse("post")

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

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

相關文章

使用VUE3實現簡單顏色盤,吸管組件,useEyeDropper和<input type=“color“ />的使用

1.使用vueuse中的useEyeDropper來實現滴管的功能和使用input中的type"color"屬性來實現顏色盤 效果&#xff1a; 圖標觸發吸管 input觸發顏色盤 組件代碼部分 &#xff1a;<dropper> ---- vueuse使用 <template><div class"sRGBHexWrap fbc…

【Python百寶箱】第三維度的魔法:探索Python游戲世界

Python在游戲開發中的魔力 前言 游戲開發一直是計算機科學中最引人入勝和具有挑戰性的領域之一。隨著技術的不斷進步&#xff0c;開發者們尋找著更快、更靈活的工具來實現他們的創意。在這個探索的過程中&#xff0c;Python以其簡潔、易學和強大的特性成為了游戲開發的熱門選…

C#每天復習一個重要小知識day4:枚舉的概念/申明/使用

目錄 1.枚舉的概念&#xff1a; 2.申明枚舉和申明枚舉變量&#xff1a; 申明枚舉語法&#xff1a; 申明枚舉變量語法&#xff1a; 1.枚舉的概念&#xff1a; 枚舉是什么&#xff1f;枚舉是一個比較特別的存在&#xff0c;它是一個命名的整形常量的集合&#xff0c;一般用它…

Flume采集Kafka并把數據sink到OSS

安裝環境 Java環境, 略 (Flume依賴Java)Flume下載, 略Scala環境, 略 (Kafka依賴Scala)Kafak下載, 略Hadoop下載, 略 (不需要啟動, 寫OSS依賴) 配置Hadoop 下載JindoSDK(連接OSS依賴), 下載地址Github 解壓后配置環境變量 export JINDOSDK_HOME/usr/lib/jindosdk-x.x.x expo…

AWS CLI和EKSCTL的客戶端設置

文章目錄 小結過程安裝AWS CLI安裝EKSCTL在兩個Kubernetes Cluster之間切換 參考 小結 在Linux環境中對AWS CLI和EKSCTL的客戶端進行了設置。 過程 安裝AWS CLI 使用以下指令安裝&#xff1a; curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"…

Qt實現繪制自定義形狀

先創建一個繼承自QWidget的控件&#xff1a; class MyPainterWidget:public QWidget 重寫各種鼠標方法&#xff1a; protected:void paintEvent(QPaintEvent *) override;void mousePressEvent(QMouseEvent *e) override; //按下void mouseMoveEvent(QMouseEvent *e) …

Xposed hook失敗的原因

最近對Xposed的比較感興趣&#xff0c;于是照著網上的給的例子做了一個Xposed模塊&#xff0c;但是在安卓模擬器上死活不生效&#xff0c;最后研究發現了兩個問題導致&#xff1a; 1、XposedBridgeAPI-89.jar 需要放到項目的lib目錄下&#xff0c;而不是libs目錄 2、XposedBr…

HEVC-SCC rgb file input

關鍵字 csc allocateCSCBuffer&#xff08;&#xff09;-> m_apcPicYuvCSC xCheckRDCostIntraCSC():更簡單&#xff0c; enum ACTRDTestTypes { ACT_TWO_CLR 0, //two color space ACT_TRAN_CLR 1, //transformed color space ACT_ORG_CL…

補充:如何提高selenium的運行速度?

已經通讀該專欄文章的同學,或許對UI自動化測試有了一定的掌握,細心的同學肯定會發現一個問題,當用例量達到一定程度時,對于整體用例的執行速度肯定不會很滿意。除了應用多線程運行用例的方式加快速度,有沒有其他的方法呢? 今天告訴大家,方法是有的!也是本人新學的。即…

[PyTorch][chapter 66][強化學習-值函數近似]

前言 現實強化學習任務面臨的狀態空間往往是連續的,無窮多個。 這里主要針對這種連續的狀態空間處理。后面DQN 也是這種處理思路。 目錄&#xff1a; 1&#xff1a; 原理 2&#xff1a; 梯度更新 3&#xff1a; target 和 預測值 4 流程 一 原理 強化學習最重要的是得到 …

c++版本opencv計算灰度圖像的輪廓點

代碼 #include<iostream> #include<opencv.hpp>int main() {std::string imgPath("D:\\prostate_run\\result_US_20230804_141531\\mask\\us\\104.bmp");cv::Mat imgGray cv::imread(imgPath, 0);cv::Mat kernel cv::getStructuringElement(cv::MORPH…

任意分圓環下的 RLWE:如何產生正確的噪聲分布

參考文獻&#xff1a; [Con09] Conrad K. The different ideal[J]. Expository papers/Lecture notes. Available at: http://www.math.uconn.edu/~kconrad/blurbs/gradnumthy/different.pdf, 2009.[LPR10] Lyubashevsky V, Peikert C, Regev O. On ideal lattices and learn…

thinkphp6生成PDF自動換行

composer安裝 composer require tecnickcom/tcpdf 示例 use TCPDF;public function info($university,$performance,$grade,$major){//獲取到當前域名$domain request()->domain();//實例化$pdf new TCPDF(P, mm, A4, true, UTF-8, false);// 設置文檔信息$pdf->SetCr…

Azkaban極簡使用文檔

登錄 地址: http://服務器ip:8081/, 用戶名密碼默認都是azkaban 構建項目流程 添加Project 編寫工作流文件 在本機新建文件夾如test, 創建一個flow20.project 文件, 內容 azkaban-flow-version: 2.0(固定步驟)編寫flow文件, 例如一個最基礎的實例 test1.flow nodes:- name…

JAVA序列化和反序列化

JAVA序列化和反序列化 文章目錄 JAVA序列化和反序列化序列化什么是序列化&#xff1f;為什么要進行序列化?如何將對線進行序列化具體實現過程 完整代碼 序列化 什么是序列化&#xff1f; 就是將對象轉化為字節的過程 為什么要進行序列化? 讓數據更高效的傳輸讓數據更好的…

Vue中的$nextTick

?&#x1f308;個人主頁&#xff1a;前端青山 &#x1f525;系列專欄&#xff1a;Vue篇 &#x1f516;人終將被年少不可得之物困其一生 依舊青山,本期給大家帶來vue篇專欄內容:vue中的$nextTick 目錄 &#x1f40b;Vue中的$nextTick有什么作用&#xff1f; &#x1f40b;一、…

socket can中是如何根據 結構體can_bittiming_const中的字段 計算bitrate的?

在 SocketCAN 中&#xff0c;can_bittiming_const 結構體用于表示 CAN 總線的定時參數&#xff0c;包括位率&#xff08;bitrate&#xff09;的計算。can_bittiming_const 包含了許多與位率相關的參數&#xff0c;其中一些參數用于計算實際的位率。 下面是一些與位率計算相關的…

小辰的智慧樹(差分+前綴和)

登錄—專業IT筆試面試備考平臺_牛客網 1.考慮總長度之和不能超過m&#xff0c;2考慮限制每棵樹高度不能低于ci&#xff0c;如果用二分最短輸能截到的高度&#xff0c;還要另外去判斷&#xff0c;是否每棵樹mid都能嚴格大于ci &#xff0c;這樣容易超時&#xff0c;換個角度&…

SQL常見函數整理 _ lead() 向下偏移

1. 用法 是在窗口函數中使用的函數&#xff0c;它用于獲取當前行的下一行&#xff08;后一行&#xff09;的某個列的值。具體來說&#xff0c;LEAD() 函數可用于查找任何給定行的下一行&#xff08;后一行&#xff09;的值&#xff0c;同時也可控制行數偏移量&#xff08;offse…

競賽選題 題目:基于LSTM的預測算法 - 股票預測 天氣預測 房價預測

文章目錄 0 簡介1 基于 Keras 用 LSTM 網絡做時間序列預測2 長短記憶網絡3 LSTM 網絡結構和原理3.1 LSTM核心思想3.2 遺忘門3.3 輸入門3.4 輸出門 4 基于LSTM的天氣預測4.1 數據集4.2 預測示例 5 基于LSTM的股票價格預測5.1 數據集5.2 實現代碼 6 lstm 預測航空旅客數目數據集預…