日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

循序渐进PYTHON3(十三) --4-- DJANGO之CSRF使用

發(fā)布時(shí)間:2023/12/10 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循序渐进PYTHON3(十三) --4-- DJANGO之CSRF使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

用 django 有多久,跟 csrf 這個(gè)概念打交道就有久。

  • 每次初始化一個(gè)項(xiàng)目時(shí)都能看到 django.middleware.csrf.CsrfViewMiddleware 這個(gè)中間件
  • 每次在模板里寫 form 時(shí)都知道要加一個(gè) {% csrf_token %} tag
  • 每次發(fā) ajax POST 請求,都需要加一個(gè) X_CSRFTOKEN 的 header

?

?

什么是 CSRF?

CSRF, Cross Site Request Forgery,?跨站點(diǎn)偽造請求。舉例來講,某個(gè)惡意的網(wǎng)站上有一個(gè)指向你的網(wǎng)站的鏈接,如果

某個(gè)用戶已經(jīng)登錄到你的網(wǎng)站上了,那么當(dāng)這個(gè)用戶點(diǎn)擊這個(gè)惡意網(wǎng)站上的那個(gè)鏈接時(shí),就會向你的網(wǎng)站發(fā)來一個(gè)請求,

你的網(wǎng)站會以為這個(gè)請求是用戶自己發(fā)來的,其實(shí)呢,這個(gè)請求是那個(gè)惡意網(wǎng)站偽造的。

?

Django 提供的 CSRF 防護(hù)機(jī)制

django 第一次響應(yīng)來自某個(gè)客戶端的請求時(shí),會在服務(wù)器端隨機(jī)生成一個(gè) token,把這個(gè) token 放在 cookie 里。然后每次 POST 請求都會帶上這個(gè) token,

這樣就能避免被 CSRF 攻擊。

  • 在返回的 HTTP 響應(yīng)的 cookie 里,django 會為你添加一個(gè) csrftoken 字段,其值為一個(gè)自動生成的 token
  • 在所有的 POST 表單時(shí),必須包含一個(gè) csrfmiddlewaretoken 字段 (只需要在模板里加一個(gè) tag, django 就會自動幫你生成,見下面)
  • 在處理 POST 請求之前,django 會驗(yàn)證這個(gè)請求的 cookie 里的 csrftoken 字段的值和提交的表單里的 csrfmiddlewaretoken 字段的值是否一樣。如果一樣,則表明這是一個(gè)合法的請求,否則,這個(gè)請求可能是來自于別人的 csrf 攻擊,返回 403 Forbidden.
  • 在所有 ajax POST 請求里,添加一個(gè) X-CSRFTOKEN header,其值為 cookie 里的 csrftoken 的值
  • Django 里如何使用 CSRF 防護(hù)

    • 首先,最基本的原則是:GET 請求不要用有副作用。也就是說任何處理 GET 請求的代碼對資源的訪問都一定要是“只讀“的。
    • 要啟用 django.middleware.csrf.CsrfViewMiddleware 這個(gè)中間件。
    • 再次,在所有的 POST 表單元素時(shí),需要加上一個(gè) {% csrf_token %} tag。
    • 在渲染模塊時(shí),使用?renderrender會處理 csrf_token 這個(gè) tag, ?從而自動為表單添加一個(gè)名為 csrfmiddlewaretoken 的 input。
    【注】csrf 裝飾器 全局:

      中間件?django.middleware.csrf.CsrfViewMiddleware

    局部:

    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    • @csrf_protect,為當(dāng)前函數(shù)強(qiáng)制設(shè)置防跨站請求偽造功能,即便settings中沒有設(shè)置全局中間件。
    • @csrf_exempt,取消當(dāng)前函數(shù)防跨站請求偽造功能,即便settings中設(shè)置了全局中間件。
    ? 代碼: settings.py ?
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 """ Django settings for my19django project. Generated by 'django-admin startproject' using Django 1.10.3. For more information on this file, see https://docs.djangoproject.com/en/1.10/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.10/ref/settings/ """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = '=_!qf8#b(*b-bd0texdrf9og219b1guo=uepdsll6v(6(n#4*w' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ ????'django.contrib.admin', ????'django.contrib.auth', ????'django.contrib.contenttypes', ????'django.contrib.sessions', ????'django.contrib.messages', ????'django.contrib.staticfiles', ] MIDDLEWARE = [ ????'django.middleware.security.SecurityMiddleware', ????'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', ] ROOT_URLCONF = 'my19django.urls' TEMPLATES = [ ????{ ????????'BACKEND': 'django.template.backends.django.DjangoTemplates', ????????'DIRS': [os.path.join(BASE_DIR, 'templates')] ????????, ????????'APP_DIRS': True, ????????'OPTIONS': { ????????????'context_processors': [ ????????????????'django.template.context_processors.debug', ????????????????'django.template.context_processors.request', ????????????????'django.contrib.auth.context_processors.auth', ????????????????'django.contrib.messages.context_processors.messages', ????????????], ????????}, ????}, ] WSGI_APPLICATION = 'my19django.wsgi.application' # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases DATABASES = { ????'default': { ????????'ENGINE': 'django.db.backends.sqlite3', ????????'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), ????} } # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ ????{ ????????'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', ????}, ????{ ????????'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', ????}, ????{ ????????'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', ????}, ????{ ????????'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', ????}, ] # Internationalization # https://docs.djangoproject.com/en/1.10/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.10/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = ( ????os.path.join(BASE_DIR,'static'), )

      

    urls.py ?
    1 2 3 4 5 6 7 8 from django.conf.urls import url from django.contrib import admin from myapp01 import views urlpatterns = [ ????url(r'^admin/', admin.site.urls), ????url(r'^login/', views.login), ????url(r'^csrf/', views.csrf), ]
    views.py ?
    1 2 3 from django.shortcuts import render def csrf(req): ????return render(req, 'csrf.html')
    csrf.html ?
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <!DOCTYPE html> <html lang="en"> <head> ????<meta charset="UTF-8"> ????<title>Title</title> </head> <body> ????<form action="/csrf/" method="post"> ????????{% csrf_token %} ????????<input type="text" name="v"/> ????????<input type="submit" name="提交"/> ????</form> ????<input type="button" value="Ajax提交" onclick="DoAjax();"/> ????<script src="/static/jquery-2.1.4.min.js"></script> ????<script src="/static/jquery.cookie.js"></script> ????<script> ?????????// 去cookie中獲取值 ????????var csrftoken = $.cookie('csrftoken'); ????????function csrfSafeMethod(method) { ????????????// these HTTP methods do not require CSRF protection ????????????return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); ????????} ????????$.ajaxSetup({ ????????????beforeSend: function(xhr, settings) { ????????????????if (!csrfSafeMethod(settings.type) && !this.crossDomain) { ????????????????????xhr.setRequestHeader("X-CSRFToken", csrftoken); ????????????????} ????????????} ????????}); ????????function DoAjax(){ ????????????$.ajax({ ????????????????url: '/csrf/', ????????????????type: 'POST', ????????????????data: {'k1': 'v1'}, ????????????????success: function (data) { ????????????????????console.log(data); ????????????????} ????????????}) ????????} ????</script> </body> </html>

    轉(zhuǎn)載于:https://www.cnblogs.com/xiaoyaojinzhazhadehangcheng/p/8042437.html

    總結(jié)

    以上是生活随笔為你收集整理的循序渐进PYTHON3(十三) --4-- DJANGO之CSRF使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。