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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django(part42)--跨站请求伪造

發(fā)布時間:2023/12/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django(part42)--跨站请求伪造 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

學(xué)習(xí)筆記,僅供參考,有錯必糾


文章目錄

    • 中間件Middleware
      • 跨站請求偽造
        • 防護方案
        • 舉個例子



中間件Middleware


跨站請求偽造


  • 跨站請求偽造攻擊

某些惡意網(wǎng)站上包含鏈接、表單按鈕或者JavaScript,它們會利用登錄過的用戶在瀏覽器中的認證信息,試圖在我們的網(wǎng)站上完成某些操作,這就是跨站請求偽造。


  • CSRF
Cross-Site Request Forgey 跨 站點 請求 偽裝

CSRF中間件模板標簽提供了對跨站請求偽造的簡單防護,它可以防止其它表單提交到我們的Django 服務(wù)器中。


防護方案


  • 取消 csrf 驗證(不推薦)

刪除(注釋)settings.py文件中的MIDDLEWARE列表里的 django.middleware.csrf.CsrfViewMiddleware 的中間件。


  • 開放驗證

在視圖處理函數(shù)增加@csrf_protect裝飾器

@csrf_protect def post_views(request):pass
  • 通過驗證(最常用)

在我們的表單中添加一個標簽

{% csrf_token %}

舉個例子


我們先打開settings.py,并打開CSRF中間件的注釋:

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', # 'mymiddleware.checklogin.MyMiddleWare', # 'mymiddleware.checklogin.VisitLimit', ]

我們向登錄界面http://127.0.0.1:8000/userinfo/login/發(fā)起請求,并進行登錄操作,點擊登錄后,網(wǎng)頁產(chǎn)生了403錯誤(沒有請求權(quán)限):

它提示我們CSRF token丟失或不正確。


現(xiàn)在,為了能夠成功提交數(shù)據(jù),我們需要在提交表單的模板中增加一個標識符:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>登陸</title> </head> <body> <form action="/userinfo/login/" method="POST">{% csrf_token %}<div><lable>用戶名</lable><input type="text" name="username"value="{{ username }}"></div><div><lable>密碼</lable><input type="password" name="password"></div><div><lable for="id_remember">記住密碼</lable><input type="checkbox" name="remember" id="id_remember"value="1"></div><div><input type="submit" value="登陸"></div></form></body> </html>

現(xiàn)在,我們再次對登錄界面http://127.0.0.1:8000/userinfo/login/發(fā)起請求,并進行登錄:

可以看到,我們正常登錄了。

我們查看一下登錄界面的網(wǎng)頁源代碼:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>登陸</title> </head> <body> <form action="/userinfo/login/" method="POST"><input type="hidden" name="csrfmiddlewaretoken" value="7azE5TZgsdRF6BqkN9jlfBZgtJOx0fvQhdBZETEEo2DATMStYJoY6GY8vWSQi9Pp"><div><lable>用戶名</lable><input type="text" name="username"value=""></div><div><lable>密碼</lable><input type="password" name="password"></div><div><lable for="id_remember">記住密碼</lable><input type="checkbox" name="remember" id="id_remember"value="1"></div><div><input type="submit" value="登陸"></div></form></body> </html>

我們發(fā)現(xiàn)CSRF token標簽自動生成了一個input標記:

<input type="hidden" name="csrfmiddlewaretoken" value="7azE5TZgsdRF6BqkN9jlfBZgtJOx0fvQhdBZETEEo2DATMStYJoY6GY8vWSQi9Pp">

value參數(shù)后的字符串是Django服務(wù)器提供給我們的密鑰。如果提交的表單中沒有帶這串密鑰,或者提供的密鑰和Django給我們的不一致,則不會提交成功,這就起到了防護作用,防止其他網(wǎng)站惡意提交給我們數(shù)據(jù)。


  • 友情提示

當我們在settings.py中設(shè)置了CSRF中間件,并在form表單中增加了CSRF token標簽。那么,如果不是我們服務(wù)器發(fā)布的表單,而是其他網(wǎng)站發(fā)布的表單向我們提交數(shù)據(jù),那么將不會提交成功。

總結(jié)

以上是生活随笔為你收集整理的Django(part42)--跨站请求伪造的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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