django post出現403的解決辦法 據說,從django1.x開始搜锰,加入了CSRF保護。
什么是CSRF
CSRF耿战,Cross Site Request Forgery蛋叼,跨站偽造請求。舉例來講剂陡,某個惡意網站上有一個指向你網站的鏈接狈涮,如果某個用戶已經登陸上你的網站了,那么當這個用戶已經登錄上你的網站上了鸭栖,那么當這個用戶點擊這個惡意網站上的鏈接時歌馍,就會向你的網站發(fā)來一個請求,你的網站會以為這個請求時用戶自己發(fā)來的晕鹊,其實呢松却,這個請求是那個惡意網站偽造的暴浦。
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攻擊匣吊,返回403Forbidden
4. 在所有ajax POST請求里,添加一個X-CSRFTOKEN header寸潦,其值為cookie里的csrftoken的值
Django里如何使用CSRF防護
1. 首先色鸳,最基本的原則是:GET請求不要用有副作用,也就是說任何處理GET請求的代碼對資源的訪問都一點要是“只讀的”
2. 要啟用django.middleware.csrf.CsrfViewMiddleware這個中間件
3. 再次见转,在所有的POST表單元素時命雀,需要加上一個{%csrf_token%}這個tag
4. 在渲染模塊時,使用RequestContext斩箫。RequestContext會處理csrf_token這個tag吏砂,從而自動為表單添加一個名為csrfmiddlewaretoken的input
django關閉csrf保護機制
1. 在setting中注釋'django.middleware.csrf.CsrfViewMiddleware'這個中間件
2. 在view.py中引入模塊
from django.views.decorators.csrf imoport csrf_exempt
在需要關閉csrf保護機制的方法前邊用@csrf_exempt裝飾器。