Python djanjo之csrf防跨站攻擊實(shí)驗(yàn)過(guò)程
一.CSRF簡(jiǎn)介
- CSRF是什么?
CSRF(Cross-site request forgery),中文名稱:跨站請(qǐng)求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。 - CSRF可以做什么?
你這可以這么理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發(fā)送惡意請(qǐng)求。CSRF能夠做的事情包括:以你名義發(fā)送郵件,發(fā)消息,盜取你的賬號(hào),甚至于購(gòu)買商品,虛擬貨幣轉(zhuǎn)賬…造成的問(wèn)題包括:個(gè)人隱私泄露以及財(cái)產(chǎn)安全。 - CSRF漏洞現(xiàn)狀?
CSRF這種攻擊方式在2000年已經(jīng)被國(guó)外的安全人員提出,但在國(guó)內(nèi),直到06年才開(kāi)始被關(guān)注,08年,國(guó)內(nèi)外的多個(gè)大型社區(qū)和交互網(wǎng)站分別爆出CSRF漏洞,如:NYTimes.com、Metafilter(一個(gè)大型的BLOG網(wǎng)站),YouTube和百度HI…而現(xiàn)在,互聯(lián)網(wǎng)上的許多站點(diǎn)仍對(duì)此毫無(wú)防備,以至于安全業(yè)界稱CSRF為“沉睡的巨人”。
引用自:https://blog.csdn.net/qq_21956483/article/details/78116094
二.CSRF(Web表單提交)
web表單下設(shè)置CSRF標(biāo)簽可以有效防止CSRF跨站攻擊(如下圖)
{% csrf_token %}
如果不設(shè)置該表單,那么在訪問(wèn)web頁(yè)面時(shí)會(huì)禁止訪問(wèn)(如下圖)
應(yīng)對(duì)禁止訪問(wèn),其實(shí)也有很多辦法,其中一個(gè)辦法就是將配置文件(settings.py)中的csrf的中間件兒拿掉,這樣原來(lái)禁止訪問(wèn)的頁(yè)面也可以成功訪問(wèn),但這種做法風(fēng)險(xiǎn)是非常大的,出于安全考慮,不推薦這樣做
另一種辦法是在視圖層加一個(gè)裝飾器(@csrf_exempt),實(shí)現(xiàn)局部不檢測(cè),換句話說(shuō),就是即使不在web表單中添加csrf標(biāo)簽,只要加了裝飾器,也能成功訪問(wèn)頁(yè)面,需要注意的是僅限加了裝飾器的內(nèi)容,其他不加裝飾器的代碼還是禁止訪問(wèn)的狀態(tài)
三.CSRF(Web表單提交)實(shí)驗(yàn)
接著我們就著上面說(shuō)的內(nèi)容用代碼演示一遍:
首先,在app下的urls.py文件下配置一個(gè)子路由
from django.urls import path, re_path from App import views urlpatterns = [ # csrf測(cè)試 path('register/',views.register,name = 'register'), ]
接著,編寫視圖函數(shù)
def register(request): if request.method == "POST": # 如果該請(qǐng)求為POST請(qǐng)求 username = request.POST.get('username') # 獲取表單中的username password = request.POST.get('password') # 獲取表單中的password print(username,password) # 打印username,password return render(request,'register.html') # 渲染模版,返回給web register.html中的內(nèi)容
web表單(未設(shè)置csrf標(biāo)簽)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注冊(cè)</title> </head> <body> <form ation="" method="post"> 用戶名:<input type="text" name="username"><br> 密碼:<input type="text" name="password"><br> <input type="submit"> </form> </body> </html>
此時(shí)開(kāi)啟服務(wù)(python manage.py runserver 8090)后,訪問(wèn)web頁(yè)面,會(huì)顯示禁止訪問(wèn)的字樣
那么接下來(lái)我們?cè)趙eb表單中設(shè)置csrf標(biāo)簽
{% csrf_token %}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注冊(cè)</title> </head> <body> <form ation="" method="post"> {# 防止跨站攻擊 #} {% csrf_token %} 用戶名:<input type="text" name="username"><br> 密碼:<input type="text" name="password"><br> <input type="submit"> </form> </body> </html>
再來(lái)訪問(wèn)web頁(yè)面,發(fā)現(xiàn)用戶名,密碼可以正常提交,且表單中會(huì)多一個(gè)csrf隱式偽隨機(jī)數(shù)
CSRF攻擊是源于WEB的隱式身份驗(yàn)證機(jī)制!WEB的身份驗(yàn)證機(jī)制雖然可以保證一個(gè)請(qǐng)求是來(lái)自于某個(gè)用戶的瀏覽器,但卻無(wú)法保證該請(qǐng)求是用戶批準(zhǔn)發(fā)送的!
CSRF防御機(jī)制思路是在客戶端頁(yè)面增加偽隨機(jī)數(shù)即可實(shí)現(xiàn)比較有效的跨站攻擊防御
四.CSRF(ajax提交)
ajax提交,需要在html中添加以下內(nèi)容
??1 引用jquery
??2 添加防止跨站攻擊標(biāo)簽
??3 添加ajax提交用button
??4 添加ajax
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注冊(cè)</title> {# ??1 引用jquery #} <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script> </head> <body> <form ation="" method="post"> {# ??2 防止跨站攻擊 #} {% csrf_token %} 用戶名:<input type="text" name="username"><br> 密碼:<input type="text" name="password"><br> <!-- {# 表單提交 #}--> <!-- <input type="submit">--> <!-- {# ??3 ajax提交 #}--> <input type="button" value="注冊(cè)" id="button"> </form> </body> </html> <script> {# ??4 ajax #} $("#button").click(function(){ username = $("[name='username']").val(); password = $("[name='password']").val(); csrf = $("[type='hidden']").val(); console.log(username,password,csrf); {# $.post("/register/") #} }); </script>
此處關(guān)于ajax傳參的方式只介紹了一種,如果還想了解的更深,請(qǐng)移步django之a(chǎn)jax傳參的兩種格式
訪問(wèn)web頁(yè)面后,輸入用戶名,密碼,查看審查元素,控制臺(tái)會(huì)顯示輸入的用戶名,密碼,以及隱式偽隨機(jī)數(shù)
在html中繼續(xù)添加以下內(nèi)容
??5 post提交
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注冊(cè)</title> {# ??1 引用jquery #} <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script> </head> <body> <form ation="" method="post"> {# ??2 防止跨站攻擊 #} {% csrf_token %} 用戶名:<input type="text" name="username"><br> 密碼:<input type="text" name="password"><br> <!-- {# 表單提交 #}--> <!-- <input type="submit">--> <!-- {# ??3 ajax提交 #}--> <input type="button" value="注冊(cè)" id="button"> </form> </body> </html> <script> {# ??4 ajax #} $("#button").click(function(){ username = $("[name='username']").val(); password = $("[name='password']").val(); csrf = $("[type='hidden']").val(); console.log(username,password,csrf); {# ??5 post提交 #} {# $.post("地址",{參數(shù)},function(返回值){}) #} $.post("/user/register/",{'username':username,'password':password,'csrfmiddlewaretoken':csrf},function(data){ console.log(data) }) }); </script>
視圖層添加以下代碼
??返回ajax請(qǐng)求
# 局部禁止 # @csrf_exempt def register(request): if request.method == "POST": username = request.POST.get('username') password = request.POST.get('password') print(username,password) # ??返回ajax請(qǐng)求 return JsonResponse({'code':1}) # {'code':1}為自定義值 return render(request,'register.html')
最后訪問(wèn)web頁(yè)面,ajax請(qǐng)求成功,且成功返回返回值{‘code’:1}
總結(jié)
到此這篇關(guān)于Python djanjo之csrf防跨站攻擊的文章就介紹到這了,更多相關(guān)djanjo csrf防跨站攻擊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何利用Python將html轉(zhuǎn)為pdf、word文件
網(wǎng)絡(luò)上存在很多將HTML轉(zhuǎn)換為PDF的軟件和工具,但是大家都知道收費(fèi),所以下面這篇文章主要給大家介紹了關(guān)于如何利用Python將html轉(zhuǎn)為pdf、word文件的相關(guān)資料,文中通過(guò)示例代碼介紹介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Python編寫一個(gè)多線程的12306搶票程序的示例
對(duì)于很多人來(lái)說(shuō),搶購(gòu)火車票人們成了一個(gè)令人頭疼的問(wèn)題,本文主要介紹了Python編寫一個(gè)多線程的12306搶票程序的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09利用Python matplotlib繪制風(fēng)能玫瑰圖
這篇文章主要給大家介紹了關(guān)于如何利用Python matplotlib繪制風(fēng)能玫瑰圖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python多進(jìn)程通信Queue、Pipe、Value、Array實(shí)例
這篇文章主要介紹了Python多進(jìn)程通信Queue、Pipe、Value、Array實(shí)例,queue和pipe用來(lái)在進(jìn)程間傳遞消息、Value + Array 是python中共享內(nèi)存映射文件的方法,需要的朋友可以參考下2014-11-11python讀取和保存為excel、csv、txt文件及對(duì)DataFrame文件的基本操作指南
最近在做一個(gè)項(xiàng)目,必須把結(jié)果保存到excel文件中,下面這篇文章主要給大家介紹了關(guān)于python讀取和保存為excel、csv、txt文件及對(duì)DataFrame文件的基本操作指南的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Python檢測(cè)和防御DOS攻擊的最簡(jiǎn)單方法
這篇文章主要介紹了Python檢測(cè)和防御DOS攻擊,首先講解在CentOS上安裝Python3,理解各個(gè)命令的含義,最后介紹了利用Python實(shí)現(xiàn)DDOS入侵檢測(cè),需要的朋友可以參考下2022-11-11PySpark與GraphFrames的安裝與使用環(huán)境搭建過(guò)程
這篇文章主要介紹了PySpark與GraphFrames的安裝與使用教程,本文通過(guò)圖文并茂實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02python光學(xué)仿真實(shí)現(xiàn)光線追跡折射與反射的實(shí)現(xiàn)
這篇文章主要為大家介紹了python光學(xué)仿真實(shí)現(xiàn)光線追跡折射與反射的實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10