使用Django发POSTt请求的时候经常会遇到Forbidden的错误,然后直接了当的方法就是去setting里面吧csrf中间件注释掉,其实csrf是django给我们提供的防护措施.

  CSRF就是一种攻击方式,原理大概是你去A网站登录后本地留下了A网站的cookie,然后去B网站访问收到了CSRF的攻击,拿到了你A网站的cookie,然后攻击者用这个cookie去请求A网站,盗取你的信息财物等.

  具体这个博客写得很好:戳CSRF

  这里我们主要讲django 中csrf防护的原理和设置.

1.csrf防护在Django中就是一个中间件,生成token验证,token验证就是你要拿到一张牌(一串字符串),django认识这个字符串,才让你访问.

#django settings.py 里面
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',
]

2.Form请求中的csrf:

我们写好一盒form表单,提交方式写为post的时,点提交会出现以下页面:

Forbidden (403) CSRF verification failed. Request aborted. Help Reason given for failure: CSRF token missing or incorrect. In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django's CSRF mechanism has not been used correctly. For POST forms, you need to ensure:   Your browser is accepting cookies.   The view function passes a request to the template's render method.   In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.   If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.   The form has a valid CSRF token. After logging in in another browser tab or hitting the back button after a login, you may need to reload the page with the form, because the token is rotated after a login. You're seeing the help section of this page because you have DEBUG = True in your Django settings file. Change that to False, and only the initial error message will be displayed. You can customize this page using the CSRF_FAILURE_VIEW setting.

错误中也说明了解决方式:在form表单中加入{% csrf_token %}:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/fm001/myCSRF/"  method="post">name: <input type="text"><input type="submit" value="提交">{% csrf_token %}</form>
</body>
</html>

我们再发post请求就可以了,检查发现{% csrf_token %} 在页面上生成了这串东西, 我们提交请求的时候会带着这个东西去请求,而这个东西就是django给我的,django会识别是不是这货

3:Ajax请求中的csrf:

写好html页面:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="/static/jquery-3.2.1.min.js"></script>
</head>
<body>
<form action="/fm001/myCSRF/"  method="post">name: <input type="text"><input type="submit" value="提交"><input id="but" type="button" value="ajax提交">
</form>
</body>
<script>$("#but").click(function () {$.ajax({url:"/fm001/myCSRF/",type:"POST", data:{"xx":"yy"},success:function (arg) {alert("ok")}})})
</script>
</html>

提交后出现如下错误:Forbidden (CSRF token missing or incorrect.): /fm001/myCSRF/

这就是我们没有提交token给django,需要在请求头里面加上token值,用jq获取cookie,所以导入jquery.cookie.js 具体:

<script>$("#but").click(function () {$.ajax({url:"/fm001/myCSRF/",type:"POST",data:{"xx":"yy"},headers:{"X-CSRFToken":$.cookie("csrftoken")},success:function (arg) {alert("ok")}})})
</script>

这样提交就可以了.

为了方便,不每次发ajax请求都去写headers,可以设置ajax请求每次发送之前加上添加token到headers的操作:

 $.ajaxSetup({beforeSend: function(xhr, settings) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}});

当然的django中也可以试着那些请求需要token,那些不需要,django提供了装饰器:

from dajngo.views.decorators.csrf import csrf_protect,csrf_exempt
@csrf_protect,#为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。加载views函数上就可以了.
@csrf_exempt,#取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

 

转载于:https://www.cnblogs.com/guoguojj/p/8395416.html

Django SCRF跨站点请求伪造相关推荐

  1. Django中如何防范CSRF跨站点请求伪造攻击

    CSRF概念 CSRF跨站点请求伪造(Cross-Site Request Forgery). 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望 ...

  2. 密码学系列之:csrf跨站点请求伪造

    文章目录 简介 CSRF的特点 CSRF的历史 CSRF攻击的限制 CSRF攻击的防范 STP技术 Cookie-to-header token Double Submit Cookie SameSi ...

  3. 跨站点请求伪造_十大常见web漏洞——跨站点请求伪造(CSRF)

    CSRF介绍 什么是CSRF呢?我们直接看例子. https://mp.toutiao.com/profile_v3/graphic/preview?do=delete&pgc_id=6829 ...

  4. java跨站点脚本编制_跨站点请求伪造 跨站点脚本编制 通过框架钓鱼漏洞 | 学步园...

    1.跨站点请求伪造 跨站点脚本编制 通过框架钓鱼漏洞 主要是通过在url或参数中添加脚本如: 1.URL中添加 2.参数value=. 添加一个过滤器对特殊字符进行拦截 package com.xxx ...

  5. web客户端安全之跨站点请求伪造攻击

    CSRF攻击,Cross-site request forgery,跨站点请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF ...

  6. 持续集成部署Jenkins工作笔记0021---21.关闭防止跨站点请求伪造

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 因为git的钩子上,并没有要求,说要带着jekins-crumb那个消息头,所以这里需要关闭这个 ...

  7. security框架工作笔记002---CSRF跨站点请求伪造(Cross—Site Request Forgery)_理解和防御

    JAVA技术交流QQ群:170933152  CSRF概念:CSRF跨站点请求伪造(Cross-Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:   ...

  8. 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

    我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 概述      众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括 ...

  9. 一文带你学习跨站点请求伪造(CSRF)

    一文带你学习跨站点请求伪造(CSRF) 1.何为CSRF 2.浏览器的Cookie策略 3.P3P头的副作用 4.CSRF攻击流程 5.CSRF的分类 GET型 POST-表单型 POST-JSON型 ...

  10. 如何解决跨站点请求伪造

    转载自:http://www.cnblogs.com/jimor/p/3417998.html IBM appscan扫描漏洞--跨站点请求伪造 appscan修订建议: 如果要避免 CSRF 攻击, ...

最新文章

  1. Boost:扩展分配器的测试程序
  2. NavReady的使用
  3. POJ 1287 Prim算法模板
  4. mysql 缓解竞争热点_MySQL优化之缓存优化
  5. 小议size_t和size_type
  6. 大工19春《计算机组成原理》,大工19春《计算机组成原理》在线作业3.doc
  7. Android应用中使用及实现系统“分享”接口
  8. Dijkstra(狄克斯特拉)求加权重的邻接矩阵最短路径(初级版)
  9. Java基础问题总结
  10. svn服务端及客户端搭建和使用(一)
  11. linux运行h3c校园网,H3C Lite轻量级校园网认证Linux客户端(For SHNU)
  12. Unity Mecanim动画的实现(一):基本程序
  13. Petya and Countryside
  14. 基于SSM的婚纱影楼系统
  15. 走近秦岭深山小镇--四亩地镇
  16. 尚硅谷大数据视频_Hive视频教程
  17. 信息系统项目管理10大管理
  18. lol老是闪退到桌面_win10
  19. 如此丝滑,Hive 中的各种常用 set 设置用起来就是爽啊
  20. u盘启动盘一键装系统教程

热门文章

  1. 【知识图谱系列】知识图谱表示学习综述 | 近30篇优秀论文串讲
  2. 【论文分享】ACL 2020 社交网络谣言判别中可解释性相关研究
  3. 【情感分析】情感分析研究的新视野
  4. 【linux】最常用 150 个Linux命令汇总
  5. 机器面试-处理分类问题
  6. 每日算法系列【EOJ 3031】二进制倒置
  7. nlp基础—5.SkipGram, CBOW, Glove, MF,Gaussian Embedding, 语言模型以及各类Smooting技术
  8. “技术·探索”技术作家英雄会带你开启不一样的1024!
  9. 博文视点MySQL书单丨无惧停机故障,数据库异常不可怕
  10. 专业人士对《程序员修炼之道》的赞誉