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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了