Django从理论到实战(part53)--CSRF攻击
學(xué)習(xí)筆記,僅供參考,有錯(cuò)必糾
摘自:某網(wǎng)課筆記
文章目錄
- CSRF攻擊
- CSRF攻擊概述
- CSRF攻擊原理
- 防御CSRF攻擊
CSRF攻擊
CSRF攻擊概述
CSRF(Cross Site Request Forgery, 跨站域請(qǐng)求偽造)是一種網(wǎng)絡(luò)的攻擊方式,它在 2007 年曾被列為互聯(lián)網(wǎng) 20 大安全隱患之一。其他安全隱患,比如 SQL 腳本注入,跨站域腳本攻擊等在近年來(lái)已經(jīng)逐漸為眾人熟知,很多網(wǎng)站也都針對(duì)他們進(jìn)行了防御。然而,對(duì)于大多數(shù)人來(lái)說(shuō),CSRF 卻依然是一個(gè)陌生的概念。即便是大名鼎鼎的 Gmail, 在 2007 年底也存在著 CSRF 漏洞,從而被黑客攻擊而使 Gmail 的用戶造成巨大的損失。
CSRF攻擊原理
網(wǎng)站是通過(guò)cookie來(lái)實(shí)現(xiàn)登錄功能的。而cookie只要存在瀏覽器中,那么瀏覽器在訪問(wèn)這個(gè)cookie的服務(wù)器的時(shí)候,就會(huì)自動(dòng)的攜帶cookie信息到服務(wù)器上去。那么這時(shí)候就存在一個(gè)漏洞了,如果你訪問(wèn)了一個(gè)別有用心或病毒網(wǎng)站,這個(gè)網(wǎng)站可以在網(wǎng)頁(yè)源代碼中插入js代碼,使用js代碼給其他服務(wù)器發(fā)送請(qǐng)求(比如ICBC的轉(zhuǎn)賬請(qǐng)求)。那么因?yàn)樵诎l(fā)送請(qǐng)求的時(shí)候,瀏覽器會(huì)自動(dòng)的把cookie發(fā)送給對(duì)應(yīng)的服務(wù)器,這時(shí)候相應(yīng)的服務(wù)器(比如ICBC網(wǎng)站),就不知道這個(gè)請(qǐng)求是偽造的,就被欺騙過(guò)去了。從而達(dá)到在用戶不知情的情況下,給某個(gè)服務(wù)器發(fā)送了一個(gè)請(qǐng)求(比如轉(zhuǎn)賬)。
防御CSRF攻擊
CSRF攻擊的要點(diǎn)就是在向服務(wù)器發(fā)送請(qǐng)求的時(shí)候,相應(yīng)的cookie會(huì)自動(dòng)的發(fā)送給對(duì)應(yīng)的服務(wù)器。造成服務(wù)器不知道這個(gè)請(qǐng)求是用戶發(fā)起的還是偽造的。這時(shí)候,我們可以在用戶每次訪問(wèn)有表單的頁(yè)面的時(shí)候,在網(wǎng)頁(yè)源代碼中加一個(gè)隨機(jī)的字符串叫做csrf_token,在cookie中也加入一個(gè)相同值的csrf_token字符串。以后給服務(wù)器發(fā)送請(qǐng)求的時(shí)候,必須在body中以及cookie中都攜帶csrf_token,服務(wù)器只有檢測(cè)到cookie中的csrf_token和body中的csrf_token都相同,才認(rèn)為這個(gè)請(qǐng)求是正常的,否則就是偽造的。那么黑客就沒(méi)辦法偽造請(qǐng)求了。在Django中,如果想要防御CSRF攻擊,應(yīng)該做兩步工作。第一個(gè)是在settings.MIDDLEWARE中添加CsrfMiddleware中間件。第二個(gè)是在模版代碼中添加一個(gè)input標(biāo)簽,加載csrf_token。示例代碼如下:
-
服務(wù)器代碼:
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.middleware.gzip.GZipMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware' ] -
模版代碼:
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"/>或者是直接使用csrf_token標(biāo)簽,來(lái)自動(dòng)生成一個(gè)帶有csrf token的input標(biāo)簽:
{% csrf_token %}
總結(jié)
以上是生活随笔為你收集整理的Django从理论到实战(part53)--CSRF攻击的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 僧敲月下门全诗典故 古寺僧敲月下门全诗典
- 下一篇: 聚类(part1)--聚类概述