Django csrf 驗證問題的實現(xiàn)
關(guān)于 csrf 的基本了解
百度百科:CSRF(Cross-site request forgery)跨站請求偽造,通??s寫為CSRF或者XSRF,是一種對網(wǎng)站的惡意利用。通過偽裝來自受信任用戶的請求來利用受信任的網(wǎng)站。
簡單來說就是攻擊者盜用你的身份,以你的名義來發(fā)送惡意請求。比如說用戶通過賬號密碼訪問了網(wǎng)站A,A網(wǎng)站將一些cookie信息保存在瀏覽器中實現(xiàn)用戶狀態(tài)行為跟蹤。這時用戶又打開了B網(wǎng)站,B網(wǎng)站返回了一些惡意代碼,并請求訪問A。這樣瀏覽器就會攜帶cookie以用戶的權(quán)限訪問A網(wǎng)站并執(zhí)行代碼。而在服務(wù)器看來,這些都是正常的用戶操作。
Django 提供的 CSRF 防護機制
django 第一次響應(yīng)來自某個客戶端的請求時,會在服務(wù)器端隨機生成一個 token,把這個 token 放在 cookie 里。然后每次 POST 請求都會帶上這個 token,
這樣就能避免被 CSRF 攻擊。
1.在返回的 HTTP 響應(yīng)的 cookie 里,django 會為你添加一個 csrftoken 字段,其值為一個自動生成的 token
2.在所有的 POST 表單時,必須包含一個 csrfmiddlewaretoken 字段 (只需要在模板里加一個 tag, django 就會自動幫你生成,見下面)
3.在處理 POST 請求之前,django 會驗證這個請求的 cookie 里的 csrftoken 字段的值和提交的表單里的 csrfmiddlewaretoken 字段的值是否一樣。如果一樣,則表明這是一個合法的請求,否則,這個請求可能是來自于別人的 csrf 攻擊,返回 403 Forbidden.
4.在所有 ajax POST 請求里,添加一個 X-CSRFTOKEN header,其值為 cookie 里的 csrftoken 的值
Django 里如何使用 CSRF 防護
- 首先,最基本的原則是:GET 請求不要用有副作用。也就是說任何處理 GET 請求的代碼對資源的訪問都一定要是“只讀“的。
- 要啟用 django.middleware.csrf.CsrfViewMiddleware 這個中間件
- 再次,在所有的 POST 表單元素時,需要加上一個 {% csrf_token %} tag
- 在渲染模塊時,使用 RequestContext。RequestContext 會處理 csrf_token 這個 tag, 從而自動為表單添加一個名為 csrfmiddlewaretoken 的 input
在Django 中對csrf 的防范
Django中自帶了防止csrf攻擊的功能,但對于初學(xué)者來說可能不知道如何使用,并給自己帶來些意外的麻煩。
例如:一個正常的表單提交操作卻總是報錯。
Django 中GET請求不需要csrf認證,post請求需要正確的認證才能得到正確的返回結(jié)果。
我們先處理一下對表單提交的 csrf 驗證問題:一般在POST表單中加入{% csrf_token %}
<form method="POST" action="#">
{% csrf_token %}
<input name='password' value='用戶密碼'>
</form>
加入了這句話后,再次提交post表單就不會出現(xiàn)問題了。
或者是另一個思路:禁用csrf
不過這樣可能帶來的危害你自己要想清楚了。
全局禁用:settings文件中找到關(guān)于csrf的中間件,直接注釋。
針對性禁用:在表單提交的對應(yīng)視圖函數(shù)上加上一個裝飾器 @csrf_exempt
——————————————————————
{% csrf_token %} 實際上是一個模板語法,將項目的token值寫入到前端頁面的表單中,這個值在建立django項目時就已經(jīng)自動生成,可以在setting中看到。
——————————————————————–
下面再看一下Ajax調(diào)用時的處理方式
在使用 jquery 的 ajax 或者 post 之前可以加入一段 js 代碼
jQuery(document).ajaxSend(function(event, xhr, settings) {
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;
}
function sameOrigin(url) {
// url could be relative or scheme relative or absolute
var host = document.location.host; // host + port
var protocol = document.location.protocol;
var sr_origin = '//' + host;
var origin = protocol + sr_origin;
// Allow absolute or scheme relative URLs to same origin
return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
(url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
// or any other URL that isn't scheme relative or absolute i.e relative.
!(/^(\/\/|http:|https:).*/.test(url));
}
function safeMethod(method) {
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
}
});
或者是直接在模板文件中寫入
$.ajaxSetup({
data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Django中ajax發(fā)送post請求 報403錯誤CSRF驗證失敗解決方案
- django通過ajax發(fā)起請求返回JSON格式數(shù)據(jù)的方法
- Django框架如何使用ajax的post方法
- django+js+ajax實現(xiàn)刷新頁面的方法
- Django中使用jquery的ajax進行數(shù)據(jù)交互的實例代碼
- 詳解Django解決ajax跨域訪問問題
- django 通過ajax完成郵箱用戶注冊、激活賬號的方法
- Django 使用Ajax進行前后臺交互的示例講解
- Django+Ajax+jQuery實現(xiàn)網(wǎng)頁動態(tài)更新的實例
- 解決django前后端分離csrf驗證的問題
- 關(guān)于django 1.10 CSRF驗證失敗的解決方法
- django框架中ajax的使用及避開CSRF 驗證的方式詳解
相關(guān)文章
使用Python和Tesseract實現(xiàn)驗證碼識別功能
驗證碼識別是一個常見且實用的技術(shù)需求,尤其是在自動化測試和數(shù)據(jù)采集場景中,通過開源 OCR工具 Tesseract,結(jié)合 Python 的強大生態(tài),我們可以高效實現(xiàn)驗證碼識別任務(wù),本篇博客將以詳細步驟和代碼示例,介紹如何使用 Python 和 Tesseract 實現(xiàn)驗證碼識別2025-01-01
Python應(yīng)用實現(xiàn)處理excel數(shù)據(jù)過程解析
這篇文章主要介紹了Python應(yīng)用實現(xiàn)處理excel數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
python實現(xiàn)對csv文件的列的內(nèi)容讀取
今天小編就為大家分享一篇python實現(xiàn)對csv文件的列的內(nèi)容讀取,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
python網(wǎng)絡(luò)編程:socketserver的基本使用方法實例分析
這篇文章主要介紹了python網(wǎng)絡(luò)編程:socketserver的基本使用方法,結(jié)合實例形式分析了python網(wǎng)絡(luò)編程中socketserver的基本功能、使用方法及操作注意事項,需要的朋友可以參考下2020-04-04

