在django 中運用 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', ]
基本應用:在提交form表單中增加 {%csrf_token%}字符串
<form method="post" action="csrf1.html"> {% csrf_token %} <input type="text" name="name" /> <input type="submit" value="提交" /> </form>
局部禁用:如果在某一些提交表單中不想用到該csrf驗證,則需要添加裝飾器來,局部禁用
from django.views.decorators.csrf import csrf_exempt @csrf_exempt def csrf1(request): if request.method == 'GET': return render(request,"csrf1.html") else: return HttpResponse('OK')
局部應用:在全局禁用的情況下,針對某個表單單獨應用
from django.views.decorators.csrf import csrf_exempt,csrf_protect @csrf_protect def csrf1(request): if request.method == 'GET': return render(request,"csrf1.html") else: return HttpResponse('OK')
在html文件源碼查看中 會看到一個type=“hidden”的一個文本框,表示添加成功
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="post" action="csrf1.html"> <input type="hidden" name="csrfmiddlewaretoken" value="q9ENddNVdkalIiUwomlM2BbbKWr8CJolKv0FqFAw9G0rt0pXr4Zof9VPYPu01ekS"> <input type="text" name="name" /> <input type="submit" value="提交" /> </form> </body> </html>
在django框架中的urls.py文件設置好,並在html頁面中測試,出現OK字樣表示csrf驗證成功
def csrf1(request): if request.method == 'GET': return render(request,"csrf1.html") else: return HttpResponse('OK')
Ajax提交時攜帶 csrf_token 第一種方式
首先要獲取到csrf的值,然后在ajax提交中 ,放置在data 中攜帶傳遞
var csrf = $('input[name ="csrfmiddlewaretoken"]').ral();
data:{"user":user,"csrfmiddlewaretoken":csrf}, --傳參的變量名必須是 csrf__token 隱藏文本框name屬性值,既文本框的名字

Ajax提交時攜帶 csrf_token 第二種方式
可以用jquery.cookie.js 這個插件來方便的獲取cookies的值,需要下載並引入
<script src="/static/jquery.cookies.js"></script>
var token = $.cookie('csrftoken');
在獲取到cookies中的csrf_token值后在ajax傳參時需要放置在 請求頭(headers)中,並且django有固定的命名規范(“X-CSRFToken”)來獲取值
headers:['X-CSRFToken':token]
<script src="/static/jquery-1.11.3.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script> function submitForm(){ var token = $.cookie('csrftoken'); var user = $('#user').val(); $.ajax({ url:'/csrf1.html', type:'POST', headers:{'X-CSRFToken':token}, data: { "user":user}, success:function (arg) { console.log(arg) } }) } </script>



