Django(part42)--跨站请求伪造
學習筆記,僅供參考,有錯必糾
文章目錄
- 中間件Middleware
- 跨站請求偽造
- 防護方案
- 舉個例子
中間件Middleware
跨站請求偽造
- 跨站請求偽造攻擊
某些惡意網站上包含鏈接、表單按鈕或者JavaScript,它們會利用登錄過的用戶在瀏覽器中的認證信息,試圖在我們的網站上完成某些操作,這就是跨站請求偽造。
- CSRF
CSRF中間件和模板標簽提供了對跨站請求偽造的簡單防護,它可以防止其它表單提交到我們的Django 服務器中。
防護方案
- 取消 csrf 驗證(不推薦)
刪除(注釋)settings.py文件中的MIDDLEWARE列表里的 django.middleware.csrf.CsrfViewMiddleware 的中間件。
- 開放驗證
在視圖處理函數增加@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/發起請求,并進行登錄操作,點擊登錄后,網頁產生了403錯誤(沒有請求權限):
它提示我們CSRF token丟失或不正確。
現在,為了能夠成功提交數據,我們需要在提交表單的模板中增加一個標識符:
<!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>現在,我們再次對登錄界面http://127.0.0.1:8000/userinfo/login/發起請求,并進行登錄:
可以看到,我們正常登錄了。
我們查看一下登錄界面的網頁源代碼:
<!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>我們發現CSRF token標簽自動生成了一個input標記:
<input type="hidden" name="csrfmiddlewaretoken" value="7azE5TZgsdRF6BqkN9jlfBZgtJOx0fvQhdBZETEEo2DATMStYJoY6GY8vWSQi9Pp">value參數后的字符串是Django服務器提供給我們的密鑰。如果提交的表單中沒有帶這串密鑰,或者提供的密鑰和Django給我們的不一致,則不會提交成功,這就起到了防護作用,防止其他網站惡意提交給我們數據。
- 友情提示
當我們在settings.py中設置了CSRF中間件,并在form表單中增加了CSRF token標簽。那么,如果不是我們服務器發布的表單,而是其他網站發布的表單向我們提交數據,那么將不會提交成功。
總結
以上是生活随笔為你收集整理的Django(part42)--跨站请求伪造的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 凤九怎么怀上白滚滚的 你知道吗
- 下一篇: Django(part43)--分页