web安全之CSRF

CSRF是什么

CSRF(Cross Site Request Forgery)跨站请求伪造,是一种攻击方式。通过名字可以看出这个攻击通常是在其他网站发出的,并不是在目标网站

该攻击会在用户不知情的情况下盗用用户的登录信息请求目标网站完成对目标网站数据库信息的修改,所以需要防范CSRF的接口只需要是修改数据的接口,对于获取信息的接口则没有这个必要。

CSRF和XSS不一样,CSRF只可以盗用用户的身份但是由于浏览器同源限制不能获取用户信息,但是XSS漏洞如果存在的话那么用户信息是存在泄漏风险的。

跨域请求的限制只存在于Ajax请求中,也就是说表单的提交没有登录验证的话是可以从a.com提交信息到b.com,b.com的服务端会把从a.com提交过来的数据写入到数据库中。即使需要登录b.com才能提交表单,那么在b.com登录之后,登录态写在b.com域名下的cookie中。很不幸的是这时候还是可以从a.com提交信息到b.com。因为向b.com发送http请求的时候b.com域名下的cookie(刚才在b.com下登录后储存了登录态)是会被带过去的,这样b.com验证是否登录就会发现身份合法,但是其实是a.com发过来的请求,并不是b.com,甚至用户都不知道这个请求发生了,只要你访问了a.com会有很多方法在用户不知道的情况下发送这个请求。

上面的描述中a.com就完成了一次对b.com的CSRF攻击。

完整描述一个案例(来自https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/)

受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款转到 bob2 的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,并且该 session 的用户 Bob 已经成功登陆。黑客 Mallory 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。Mallory 可以自己发送一个请求给银行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是这个请求来自 Mallory 而非 Bob,他不能通过安全认证,因此该请求不会起作用。这时,Mallory 想到使用 CSRF 的攻击方式,他先自己做一个网站,在网站中放入如下代码: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,并且通过广告等诱使 Bob 来访问他的网站。当 Bob 访问该网站时,上述 url 就会从 Bob 的浏览器发向银行,而这个请求会附带 Bob 浏览器中的 cookie 一起发向银行服务器。大多数情况下,该请求会失败,因为他要求 Bob 的认证信息。但是,如果 Bob 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 Bob 的认证信息。这时,悲剧发生了,这个 url 请求就会得到响应,钱将从 Bob 的账号转移到 Mallory 的账号,而 Bob 当时毫不知情。等以后 Bob 发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。而 Mallory 则可以拿到钱后逍遥法外。

怎么防御

既然知道了CSRF的原理,那么就来说说怎么防御这个类型的攻击。

referer

通过上面的描述可以看出CSRF发起的请求并不是在目标网页上,请求来自哪个域名HTTP请求头部会有一个字段(Referer)的值会标识出来。服务端可以通过这个字段来辨别发过来的请求的域名是否是自己,如果不是自己另做处理,如果是自己则正常处理。

但是这个方法也不是万无一失的,请求头的字段在某些浏览器通过某些手段是可以修改的,这样的话就还是有问题。通过这个问题告诉我们,自身的安全依赖第三方还是不靠谱。

tooken

因为CSRF是在其他网站发起请求完成的攻击,那么发起攻击的网站是获取不到目标网站页面上信息的。那么如果我们将一个tooken放在页面上,发起请求的时候都需要带上这个tooken不就解决这个问题了吗。

通常是用脚本完成链接tooken的添加,如果是GET请求在search里面加上tooken字段和对应的值。如果是POST请求的form就新建一个hidden的input放在form里面,提交的时候就会自动带上。

但是这样还有一个问题。想想一下这个场景,不法者通过b.com的一个发布一个连接是a.com这样的话是不是在页面上动态添加tooken的时候也会为a.com加上,这样你点击这个链接进去之后a.com还是可以获取到b.com页面上的tooken,还是可以让tooken验证通过完成攻击。所以添加tooken的时候需要验证这个域名是不是自己的。

即使这样了还存在一个缺陷,这样添加的tooken只在已有的DOM上才加了,如果是通过JS后期插入的链接是还是没有tooken即使这个链接是合法的,所以添加有链接的DOM的时候需要再添加一次tooken。

在HTTP头中添加自定义属性

这个方式有一定的局限性,只能用在Ajax中,也就是说要改写整个网站的请求发送方式为Ajax。对于传统网站代价大点,但是对于单页的网站几乎就没有成本了。

这中方式也是利用tooken,然后在服务端验证这个字段中的tooken来判断是否是合法请求。这种方式避免了上面直接在链接中加入tooken的一些缺点,这样发送的请求不会被浏览器记住。

不要点来历不明的链接,好奇害死猫。

参考

CSRF 攻击的应对之道

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AssertJ Fest Hamcrest

我以前曾在博客中介绍过Hamcrest ,并使用其assertThat方法优先于JUnit的Assert 。 但是,我很快发现了FEST断言 ,并愉快地切换到它。 它提供了与Hamcrest相同的改进的测试可读性,并改善了故障消息,但具有启用IDE自动完…

Edge浏览器开发人员工具

UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240" 本地存储/会话存储模拟达到上限 资源终于全部列表出来了 删除 Cookie 和 删除会话 Cookie 样式可以实时编辑了 …

作为入门开发者应该知道的事

前言 如果你是开始学习编程并且决心学好,或者你刚离开学校还没有工作,这篇文章刚好适合你 我将分享作为开发者在工作过程中积累的关键点和隐藏的真相 编程是件困难的事,不仅仅对你而言 没有人说过编程是简单的事情,如果是的话&…

linux 第一个内核模块Hello World

内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kern…

懒惰和贪婪-正则回溯

需要一定的正则基础,并且是基于JS写的文章。 正则表达式是从左往右匹配的。在使用正则表达式的时候我们知道/.*/可以匹配一个字字符串中所有的字符,/.*?/却一个字符都匹配不到。/(.*)\d/中的.\*可以匹配除了最后一位数字的所有字符,但是之前…

简单的Java SSH客户端

可以使用jcabi-ssh在Java中通过几行代码通过SSH执行shell命令: String hello new Shell.Plain(new SSH("ssh.example.com", 22,"yegor", "-----BEGIN RSA PRIVATE KEY-----...") ).exec("echo Hello, world!");jcabi-ssh…

【JS复习笔记】00 序

作为一个前端苦手,说是复习,你就当我是重学好了。 好吧,我当然不可能抱着一个砖头去复习,所以捡了本薄的来读——《JavaScript语言精粹》。 当初带我的人说这本书挺好,就看这本书好了。我觉得他说的挺对。我喜欢这么…

高并发网络架构解决方案分析

1:html静态化2:图片服务器分离3:数据库集群4:缓存5:负载均衡大型高并发高负载网站的系统架构我在Cernet做过拨号接入平台的搭建,而后在Yahoo3721负载搜索引擎前端平台开发,又在猫扑处理过大型社…

Generator执行步骤浅析

在Generator函数出现之前JS的函数只能返回一个值,返回的方式就是return,但是Generator函数可以返回多个值,返回的方式是yield。并且Generator赋予了外部动态影响函数内部的执行顺序的能力。 基础语法 function* f () {const a yield 1cons…

使用 jQuery.Pin 垂直滚动时固定导航

ZKEACMS的导航默认是不能固定的,随着页面的滚动而滚动,为了有更好的用户体验,当页面往下滚动时,可以将导航固定在顶端,这样方便用户点击。 jQuery Pin 借助jQuery的一个插件 jQuery.Pin,这个插件可在用来…

班级名称

在Java中,每个类都有一个名称。 类位于软件包中,这使我们程序员可以一起工作,避免名称冲突。 我可以为A类命名,也可以为A类命名,只要它们位于不同的程序包中,它们就可以很好地协同工作。 如果您查看Class的…

MDK升级后的头文件冲突

////TITLE:// MDK升级后的头文件冲突//AUTHOR:// norains//DATE:// Friday 17-June-2011//Environment:// Keil MDK 4.2// .NET Micro Framework Porting 4.1// 因为在移植的时候,发现了不少MDK编译的一些问题,于是便想升级到最新版本&a…

内置假对象

尽管模拟对象是进行单元测试的理想工具,但通过模拟框架进行模拟可能会将您的单元测试变成难以维护的混乱。 这种复杂性的根本原因是我们的对象太大。 他们有很多方法,这些方法返回其他对象,这些对象也有方法。 当将此类对象的模拟版本作为参…

微信小程序面试题

小程序与原生App哪个好? 答: 小程序除了拥有公众号的低开发成本、低获客成本低以及无需下载等优势,在服务请求延时与用户使用体验是都得到了较大幅度 的提升,使得其能够承载跟复杂的服务功能以及使用户获得更好的用户体验。 简单…

阻止默认事件

在JS中经常需要阻止元素的默认事件。而阻止默认事件的方法都是使用事件对象的preventDefault()方法或者在函数中return false。在最近一次开发中使用preventDefault()方法的时候遇到一个问题&#xff0c;现在才想/猜明白原因&#xff0c;场景是这样的&#xff1a; <a href&…

MySQL之SQL优化详解(三)

目录 MySQL 之SQL优化详解&#xff08;三&#xff09; 1. 索引优化2. 剖析报告:Show ProfileMySQL 之SQL优化详解&#xff08;三&#xff09; 1. 索引优化 一旦建立索引&#xff0c;select 查询语句的where条件要尽量符合最佳左前缀的原则&#xff0c;如若能做到全值匹配最好。…

jUnit:规则

规则在测试&#xff0c;测试用例或测试套件周围增加了特殊处理。 他们可以对类中的所有测试执行通用的其他验证&#xff0c;并发运行多个测试实例&#xff0c;在每个测试或测试用例之前设置资源&#xff0c;然后将其拆除。 该规则可以完全控制将要应用到的测试方法&#xff0c…

常用浏览器内核:

浏览器内核又可以分为两部分&#xff1a;渲染引擎和JS引擎。 PC端&#xff1a;IE&#xff1a;Trident&#xff0c;沿用到IE11,即兼容模式。 IE8 的 JavaScript 引擎是 Jscript&#xff0c;IE9&#xff08;PS: JS内核&#xff09; 开始用 Chakra&#xff0c;这两个版本区别很大…

行内格式化

相对于熟知的块级格式化上下文&#xff0c;行内格式化上下文更加的复杂难明。行内元素不像块级元素那样直来直去&#xff0c;一个块级元素占据一行&#xff0c;其他块级元素在垂直方向依次向下排列即可。行内元素不同&#xff0c;多个行内元素可以在一行显示&#xff0c;那么&a…

[转载]struts+hibernate遇到的错误总结

原文地址&#xff1a;strutshibernate遇到的错误总结作者&#xff1a;畫上句號经过对strutshibernate几天的学习&#xff0c;大体上还算比较的了解机制&#xff0c;以前学习的时候都是 单个框架训练&#xff0c;没有结合2个框架做&#xff0c;所以今天就找了个网上发布租房信息…