亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Django中使用csrf 驗證

發布時間:2021-06-01 17:43:56 來源:億速云 閱讀:294 作者:Leah 欄目:開發技術

這篇文章給大家介紹如何在Django中使用csrf 驗證,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Django 提供的 CSRF 防護機制

django 第一次響應來自某個客戶端的請求時,會在服務器端隨機生成一個 token,把這個 token 放在 cookie 里。然后每次 POST 請求都會帶上這個 token,

這樣就能避免被 CSRF 攻擊。

1.在返回的 HTTP 響應的 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攻擊的功能,但對于初學者來說可能不知道如何使用,并給自己帶來些意外的麻煩。

例如:一個正常的表單提交操作卻總是報錯。

Django 中GET請求不需要csrf認證,post請求需要正確的認證才能得到正確的返回結果。

我們先處理一下對表單提交的 csrf 驗證問題:一般在POST表單中加入{% csrf_token %}

<form method="POST" action="#">
{% csrf_token %}
  <input name='password' value='用戶密碼'>
</form>

加入了這句話后,再次提交post表單就不會出現問題了。

或者是另一個思路:禁用csrf 

不過這樣可能帶來的危害你自己要想清楚了。

全局禁用:settings文件中找到關于csrf的中間件,直接注釋。

針對性禁用:在表單提交的對應視圖函數上加上一個裝飾器 @csrf_exempt

——————————————————————

{% csrf_token %} 實際上是一個模板語法,將項目的token值寫入到前端頁面的表單中,這個值在建立django項目時就已經自動生成,可以在setting中看到。

——————————————————————–

下面再看一下Ajax調用時的處理方式

在使用 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 }}' },
});

關于如何在Django中使用csrf 驗證就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

锦屏县| 韶关市| 墨玉县| 莱州市| 门头沟区| 武义县| 上蔡县| 城固县| 渝中区| 比如县| 郯城县| 乌鲁木齐市| 射洪县| 屏东市| 屏南县| 泗水县| 邛崃市| 子洲县| 锦屏县| 普定县| 昭平县| 南澳县| 上饶市| 永定县| 宁安市| 陈巴尔虎旗| 如皋市| 伊金霍洛旗| 泊头市| 班玛县| 中牟县| 普洱| 安乡县| 东明县| 建阳市| 沧源| 中西区| 屯留县| 高唐县| 张家港市| 奇台县|