csrf跨站请求伪造

CSRF(Cross Site Request Forgery) 跨站请求伪造。也被称为One Click Attack和Session Riding,通常缩写为CSRF或XSRF。如果从名字你还不不知道它表示什么,你可以这样理解:攻击者(黑客,钓鱼网站)盗用了你的身份,以你的名义发送恶意请求,这些请求包括发送邮件、发送消息、盗取账号、购买商品、银行转账,从而使你的个人隐私泄露和财产损失。

CSRF攻击实例

听了这么多,可能大家还云里雾里,光听概念可能大家对于CSRF还是不够了解,下面我将举一个例子来让大家对CSRF有一个更深层次的理解。

# 以钓鱼网站为例:我搭建一个跟正规网站一模一样的界面(中国银行)用户不小心进入到了我们的网站,用户给某个人打钱打钱的操作确确实实是提交给了中国银行的系统,用户的钱也确确实实减少了但是唯一不同的时候打钱的账户不是用户想要打的账户变成了一个莫名其妙的匿名账户
# 内部本质我们在钓鱼网站的页面 针对对方账户 只给用户提供一个没有name属性的普通input框然后我们在内部隐藏一个已经写好name和value的input框那么我们在提交的时候只向后端提交存在name属性和value值得input框内容此时隐藏得input框得name和value属性值是固定得,相当于'诈骗'账户

示例:

8000端口:html

<h1>我是正真得网站</h1>
<form action="" method="post"><p>username: <input type="text" name="username"></p><p>target_user: <input type="text" name="target_user"></p><p>money: <input type="text" name="money"></p><p><input type="submit"></p></form>

8001端口:html

<h1>我是钓鱼网站</h1>
<form action="http://127.0.0.1:8000/transfer/" method="post"><p>username: <input type="text" name="username"></p><p>target_user: <input type="text"></p><input type="text" name="target_user" value="gary" style="display: none"><p>money: <input type="text" name="money"></p><p><input type="submit"></p>
</form>需要将钓鱼网站的端口号修改,不然冲突
display:none可以隐藏某个元素,且隐藏的元素不会占用任何空间。也就是说,该元素不但被隐藏了,而且该元素原本占用的空间也会从页面布局中消失。

如何避免上述问题呢:

# csrf跨站请求伪造校验网站在给用户返回一个具有提交数据功能页面的时候会给这个页面加一个唯一标识当这个页面朝后端发送post请求的时候 我的后端会先校验唯一标识,如果唯一标识不对直接拒绝(403 forbbiden)如果成功则正常执行

form如何符合校验

前提:

'django.middleware.csrf.CsrfViewMiddleware',  # 需要去配置文件将csrf中间件打开
# 只需要在form表单内添加:{% csrf_token %}<h1>我是正真得网站</h1>
<form action="" method="post">{% csrf_token %}<p>username: <input type="text" name="username"></p><p>target_user: <input type="text" name="target_user"></p><p>money: <input type="text" name="money"></p><p><input type="submit"></p>
</form>

ajax如何符合校验

# 除了form表单可以提交post请求之外,ajax也是可以提交post请求的
# 那么上述方法只是针对form表单的,那么我们接下来来研究ajax是如何

方式一:

// 第一种 利用标签查找获取页面上的随机字符串
<script>$('#d1').click(function (){$.ajax({url:'',type:'post',data:{'username':$('[name=username]').val(),'target_user':$('[name=target_user]').val(),'money':$('[name=money]').val(),'csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},// 主动取出csrfmiddlewaretoken对应的值发送给后端success:function (){}})})
</script>

方式二:

# 利用模版语法提供的快捷书写 (如果是前后端分离的项目,就不方便使用该方法)data:{'username':$('[name=username]').val(),'target_user':$('[name=target_user]').val(),'money':$('[name=money]').val(),'csrfmiddlewaretoken':{{ csrf_token }},

方式三:

// 第三种 通用方式直接拷贝js代码并应用到自己的html页面上即可
{% load static  %}
<script src="{% static 'js/mycsrf.js' %}"></script>data:{'username':$('[name=username]').val(),'target_user':$('[name=target_user]').val(),'money':$('[name=money]').val()},

配置文件:

// 需手动创建js文件function getCookie(name) {var cookieValue = null;if (document.cookie && document.cookie !== '') {var cookies = document.cookie.split(';');for (var i = 0; i < cookies.length; i++) {var cookie = jQuery.trim(cookies[i]);// Does this cookie string begin with the name we want?if (cookie.substring(0, name.length + 1) === (name + '=')) {cookieValue = decodeURIComponent(cookie.substring(name.length + 1));break;}}}return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}$.ajaxSetup({beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}
});

csrf相关装饰器

需求:1.网站整体都不校验csrf,就单单几个视图函数校验2.网站整体都校验csrf,就单单几个不视图函数不校验
# 这里django给我们提供了现成的两个装饰器供我们使用
1. csrf_protect   需要校验
2. csrf_exempt   忽视校验

csrf_exempt忽视校验:

csrf_protect需要校验

研究CBV添加装饰器是否可行:

from django.views import View# @method_decorator(csrf_protect,name='post')  # 针对csrf_protect 第二种方式可以
# @method_decorator(csrf_exempt,name='post')  # 针对csrf_exempt 第二种方式不可以
@method_decorator(csrf_exempt,name='dispatch')
class MyCsrfToken(View):# @method_decorator(csrf_protect)  # 针对csrf_protect 第三种方式可以# @method_decorator(csrf_exempt)  # 针对csrf_exempt 第三种方式可以def dispatch(self, request, *args, **kwargs):return super(MyCsrfToken, self).dispatch(request,*args,**kwargs)def get(self,request):return HttpResponse('get')# @method_decorator(csrf_protect)  # 针对csrf_protect 第一种方式可以# @method_decorator(csrf_exempt)  # 针对csrf_exempt 第一种方式不可以def post(self,request):return HttpResponse('post')

总结:

针对csrf_protect:需要校验三种方式都可行。
针对csrf_exempt:忽视校验只有给dispatch方法添加才可行(可以在dispatch方法紧上方添加装饰器,也可以使用@method_decorator(csrf_exempt,name='dispatch')在类上方添加装饰器)

Django中间件之csrf跨站请求伪造相关推荐

  1. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  2. 8中间件,csrf跨站请求伪造,auth模块

    昨日内容回顾  多对多三种创建方式   1.全自动    完全依赖于ManyToMany让django orm自动创建第三张表    优势:不需要你创建第三张表  自动创建    不足:第三张表扩展性 ...

  3. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  4. csrf跨站请求伪造,CBV添加装饰器,auth认证模块,基于django中间件设计项目功能

    文章目录 csrf跨站请求伪造 csrf的定义 csrf的分类 csrf的攻击过程 csrf的攻击条件 举例说明 Django提供的解决策略 csrf相关装饰器 FBV CBV 方法一(直接在类中的某 ...

  5. Django之CSRF跨站请求伪造(老掉牙的钓鱼网站模拟)

    首先这是一个测试的代码 请先在setting页面进行下面操作 注释完成后,开始模拟钓鱼网站的跨站请求伪造操作: 前端代码: <!DOCTYPE html> <html lang=&q ...

  6. CSRF 跨站请求伪造 为什么b网站请求a网站的地址能带上a网站的cookie

    知道csrf后的问题:CSRF 跨站请求伪造 为什么b网站请求a网站的地址能带上a网站的cookie 答:script.image.iframe的src都不受同源策略的影响.

  7. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结。

    之前就了解过这方面的知识,但是没有系统地总结.今天在这总结一下,也让自己在接下来的面试有个清晰的概念. XSS跨站脚本攻击: xss 跨站脚本攻击(Cross Site Scripting),为了不和 ...

  8. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结

    转载:https://blog.csdn.net/baidu_24024601/article/details/51957270 XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结. <di ...

  9. CSRF 跨站请求伪造攻击

    1.概念 全称是CSRF 跨站请求伪造攻击,攻击者利用用户已登陆的账号,诱导用户访问已构造好的恶意链接或页面,在用户不之情的情况下,做一些违反用户本意的一些违法操作. 同源策略:协议相同,域名相同,端 ...

  10. CSRF跨站请求伪造 | 总结记录

    CSRF跨站请求伪造 CSRF通常会配合XSS. 服务端错把浏览器发起的请求当成用户发起的请求,会造成XSS问题. 产生原因: 1.同上. 2.已登录的浏览器打开恶意网址后执行了相应操作. 一些概念 ...

最新文章

  1. unity3d 绘制小地图_老师!我想用Tilemap做元气骑士款地图!
  2. PHP面试题:mysql_fetch_row() 和mysql_fetch_array之间有什么区别?
  3. 实验详解——Cobbler自动部署最小化安装
  4. dorado开发模式下实现动态查询
  5. Java和pathion_Spring配置中的classpath:与classpath*:的区别
  6. (转)淘淘商城系列——使用maven tomcat插件启动聚合工程
  7. mysql数据库表子查询语句_MySQL使用子查询教程
  8. 跟随我在oracle学习php(27)
  9. [转载] R语言read.table函数
  10. javase二维数组笔记
  11. android控制软键盘显示与隐藏
  12. Linux RTC驱动模型分析之rtc-sysfs.c
  13. 把数据对象转成字符串_R语言处理环境监测数据(2):时间数据处理
  14. AI艺术的发展:让艺术通过人工智能变得更具创造力和人性化
  15. 如何完美的卸载Office2007?
  16. 3.单片机 数码管显示
  17. 中医文化之熏蒸的历史
  18. 人生无捷径「一万小时定律·正篇」
  19. 微信小程序:上传的图片显示旋转问题
  20. html如何设置radio单选按钮默认选中效果

热门文章

  1. Unity 关于双叶高光(Dual lobe Specular)
  2. 一些有用的英语学习资料
  3. 《富兰克林自传》读后感:从这个接地气的伟人身上我们可以学到什么?
  4. 微信小程序 表单控件【族谱聚微信小程序表单控件】
  5. 凌晨3点--- 给我一支烟
  6. el-input 正则,非负数且只有一个小数点
  7. 国外cpa广告联盟EMU-lead-cpa联盟详解(2)im搭建
  8. 浅谈安卓逆向协议(二)- 抖音,皮皮虾
  9. 把多个EXCEL文件汇总到一个EXCEL中
  10. typroa 思维导图_巧用Markdown和百度脑图