csrf_token 验证


在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>

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM