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>
复制代码

 

 

posted @   茶叶蛋蛋  阅读(886)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示