Web安全之CSRF基本原理与实践_weixin_30895603的博客-程序员宅基地

技术标签: ViewUI  web安全  json  javascript  

阅读目录

一:CSRF是什么?及它的作用?

CSRF(Cross-site Request Forgery), 中文名字叫:跨站请求伪造。那么什么是跨站请求伪造呢?就是用户登录一个正常的网站后,由于没有退出该正常网站,cookie信息还保留,然后用户去点击一个危险的网站页面,那么这个时候危险网站就可以拿到你之前登录的cookie信息。然后使用cookie信息去做一些其他事情。

因此需要完成一次CSRF攻击,需要完成如下事情:

1. 登录受信任的网站A,并且在本地生成cookie。
2. 在不登出网站A的情况下,继续访问危险网站B。

因此CSRF基本原理是:假设A网站是一个银行网站,而我是该网站的用户,当我以受信任的身份登录了该网站的时候,这时候A网站是通过cookie保留了我们的登录状态,这个时候我去登录了恶意网站B的时候,B网站就会拿到我登录A网站的cookie信息到,因此B网站就把拿到的cookie信息去重新请求A网站的接口,但是在该接口后面的参数做一些修改,因此就这样达到攻击的目的。

二:CSRF 如何实现攻击

demo(get请求)举例:

假如A网站,它转账接口假如是get请求来完成转账操作的话,比如我本地的demo查询接口就当做转账接口来打比方吧。(http://localhost:6789/user/query2?name=&age=&sex=). 我这边的demo举例还是之前的实现用户登录查询数据那个demo来打比方哦(https://www.cnblogs.com/tugenhua0707/p/10074148.html).

A网站查询接口是 http://localhost:6789/user/query2?name=&age=&sex= 这样的,然后当我查询(或叫转账)完成后或登录完成后,我该网站并没有退出,而是继续做其他的事情,比如说切换到其他页面去,发现其他页面有个A片网站,我发现挺有兴趣的,
突然点击进去,然后那个A片网站站点正好监听了银行转账的接口,它把该接口方法一个A网站页面上去,然后以img标签的形式去请求下该接口。如下图所示

比如上面的 查看好看的妹子的代码如下:

<div>
  <a href="http://localhost:3001/" target="_blank">查看好看的妹子</a>
</div>

它会链接到我B站点上的一个服务器下,该B站点的页面有如下代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset=utf-8>
  <title>csrf攻击</title>
</head>
<body>
  <div>
    <img src="http://localhost:6789/user/query2?name=&age=&sex=" style="display:none" />
  </div>
</body>
</html>

那么只要点击进来后,那么就会请求下这个查询接口(假如这个查询接口是转账的接口的话),那么攻击者就会改下下get请求的参数,比如转账给某某后,比如转账10万给name=kongzhi, 那么kongzhi账户上就新增了10万元了,但是登录用户的账户就减少了10万了。

出现如上原因的是:使用get请求是不安全的操作,使用get请求去转账,在访问网站B站点时候,由于我们已经登录了A银行网站,而在B站点中则是以 img标签的get方式去请求第三方资源(也就是A网站中的转账接口)。因此B站点中的img中接口也会带上我网站A的cookie去请求数据,但是银行是根据cookie信息来进行判断的,只要cookie信息正确,银行就会把他们当做合法的请求,因此这样就会被攻击者利用了。

如上的demo,我使用node启动了2个服务,一个是 http://localhost:6789 服务,另外一个是 http://localhost:3001/ 服务来进行演示下。

demo(post请求)举例:

由于get请求不安全,因此银行网站决定使用post来请求接口,比如我现在查询接口改成post了,如下所示:

但是B站点(攻击者的服务器)也与时俱进,也使用post请求接口,它使用的是隐藏iframe + form表单进行模拟post请求,比如B 站点的提交post请求的页面代码改成如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset=utf-8>
  <meta name="referrer" content="never">
  <title>csrf攻击</title>
</head>
<body>
  <div>
    <form method="post" action="http://localhost:6789/user/query" target="localwindow" id="formId">
      <input type="hidden" name="name" value="11"/>
      <input type="hidden" name="age" value="30" />
      <input type="hidden" name="sex" value="1" />
    </form>
    <iframe style="display:none;" name="localwindow"></iframe>
  </div>

  <script type="text/javascript">
    var f = document.getElementById('formId');
    f.submit();
  </script>
</body>
</html>

然后当我们点击危险链接的时候,也会发出成功请求,转账也能顺利进行。如下图所示:

如上演示也可以看到,攻击者也可以使用csrf攻击成功。那么上面最主要的是演示 get/post 请求对于web安全性的内容,出现这样的情况,我们该如何防范呢?

三:CSRF 防范措施

那么防范肯定是在服务器端那边防范比较好,具体防范有如下几种:

1. 验证 HTTP Referer字段

HTTP协议中有一个访问来源的字段是Referer. 服务器端可以根据该字段进行判断,判断该来源的域名是否是本地网站,如果不是的话,可以直接认为是危险链接。拒绝访问。但是该方法还是有缺陷的,比如我把我网站页面使用微信分享出去,然后其他人从微信朋友圈点击进来,那么该referer也不是本地域名网站的。

2. 加验证码

验证码虽然可以保证安全,但是验证码需要与用户交互,感觉交互上比较麻烦点。但是由于用户体验的话,网站不可能给接口都加上验证码,但是可以对用户登录加上的,比如我们的博客园登录的时候有时候需要验证码。验证码可以作为一种手段,但是不是最好的方法。

3. 使用Token

我们常见的登录页面,都是使用token来完成,可以确保安全性。想要了解 JSON Web Token, 可以看我之前一篇文章.

比如:用户登录页面,登录成功后,服务器端会生成一个token,放在用户的session或cookie当中,以后每次客户端与服务器端交互的时候都会把该token带过去,服务器端获取该token与自己服务器端保存的token对比,如果相同的话,说明是安全的,否则的话,会拒绝该请求的。

查看github源码

转载于:https://www.cnblogs.com/tugenhua0707/p/10884059.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30895603/article/details/96295715

智能推荐

如何使用div盒子来模拟线条三角形_常黎凛的博客-程序员宅基地

一、分析方法:使用盒子来模拟线条三角形三个盒子。一个来限制线条位置,另外两个分为上下结构,通过旋转的方法,再微调top,left值,便可做出线条三角形。二、加入三个盒子 外部盒子em,内部盒子i,b。em盒子class属性的值为arrow。源代码: &lt;ul&gt; &lt;li&gt; &lt;a href=""&gt;目的地&lt;/a&gt; ...

XenServer中LVM的性能_weixin_34244102的博客-程序员宅基地

在XenServer 5.5以后,提供了snapshot和fast clone的功能,这些功能,具有一定的性能开销,但能够带来一定的灵活性。纯粹为了性能,在基于LVM的存储上支持创建RAW格式的VDI,而默认创建的VDI为VHD格式。RAW格式,虽然能够带来性能的提升,但XenServer不支持RAW格式 VDI的快照。基于能够通过XenCenter或者命令行快照挂载了R...

register int var v.s. int var_baidu_20993761的博客-程序员宅基地

register int var v.s. int varMicrosoft SpecificThe compiler does not accept user requests for register variables; instead, it makes its own register choices when global register-allocation opt

C#操作Excel文件(转)_weixin_30500289的博客-程序员宅基地

摘要:本文介绍了Excel对象、C#中的受管代码和非受管代码,并介绍了COM组件在.net环境中的使用。  关键词:受管代码;非受管代码;Excel对象;动态连接库  引言  Excel是微软公司办公自动化套件中的一个软件,他主要是用来处理电子表格。Excel以其功能强大,界面友好等受到了许多用户的欢迎。在设计应用系统时,对于不同的用户,他们对于打印的需求是不一样...

海量数据迁移之通过rowid切分大表_congjiu2607的博客-程序员宅基地

在之前的章节中,讨论过了通过 分区+并行等方式来进行超大的表的切分,通过这种方式能够极大的提高数据的平均分布,但是不是最完美的。比如在数据量再提高几个层次,我们假设这个表目前有1T的大小。有10个分区,最大的分区有4...

Android中快速打包神器_贤泽的博客-程序员宅基地

Android app上线当有很多渠道的时候,打包就很痛苦,使用as默认的打包,打包20+个大概需要半小时,太慢了,效率很差,之后就推荐两个快速打包工具https://github.com/mcxiaoke/packer-ng-pluginhttps://github.com/Meituan-Dianping/walle前者需要禁用v2签名,但后者就可以兼容v2签名,两者操作都很简单,

随便推点

Response header status contentType_iteye_11997的博客-程序员宅基地

文件下载,指定默认名srxljlResponse.AddHeader(&quot;content-type&quot;,&quot;application/x-msdownload&quot;);Response.AddHeader(&quot;Content-Disposition&quot;,&quot;attachment;filename=要下载的文件名.rar&quot;);刷新页面srxljlResponse.AddHeader “REFRESH”, ”60;UR...

简信CRM系统:移动CRM系统让销售工作更顺利展开_简信CRM的博客-程序员宅基地

企业在管理和销售的过程中总是会遇到各种各样的问题,以下场景都是企业经常会遇到的:1、销售人员在路上接到了客户的电话,可是这个客户已经很久没有和自己进行沟通了,销售员甚至想不起来对方是做什么的。这时候,沟通就遇到了屏障,如果在去询问对方,就显得自己不专业。2、领导出差,可是有些紧急的申请等待领导回复审批,这个时候,死活等不到领导的答复,但是客户又催的紧,要求相关人员即刻到场,那边领导又不审批,又不好擅自行动,员工常常会陷入尴尬的境地。3、下班时间,客户的服务诉求不能得到及时的响应,比如说在客户在产品的使

sybase数据库导出mysql_sybase数据库备份的两种方式_邝烁的博客-程序员宅基地

sybase数据库备份是使用sybase的用户都需要掌握的知识,下面就对sybase数据库备份的常用方法作详细的介绍,供您参考。sybase数据库备份有两种方式,一种是对单表进行备份,一种是对整个数据库进行备份1、单表备份与恢复只需要使用sybase提高的bcp命令就可以了:bcp的命令格式:bcp 数据库名..表名 in/out 文件名字 -Usa –Ppassword -S SERVERNAM...

cas108443-61-4/四羧基苯基卟啉钴TCPP-(Co2+)/分子量:843.659/分子式:C48H24N4O8Co-4/科研试剂_遇见齐岳的博客-程序员宅基地

cas108443-61-4/四羧基苯基卟啉钴TCPP-(Co2+)/分子量:843.659/分子式:C48H24N4O8Co-4/科研试剂

Ajax+Spring MVC实现跨域请求(JSONP)_青峰祭坛的博客-程序员宅基地

http://www.open-open.com/lib/view/open1430094913490.html背景:AJAX向后台(springmvc)发送请求,报错:已阻止交叉源请求:同源策略不允许读取 http://127.0.0.1:8080/DevInfoWeb/getJsonp 上的远程资源。可以将资源移动到相同的域名上或者启用 CORS 来解决这个问题

python内置函数大全_Winterto1990的博客-程序员宅基地

本篇文章将介绍一下python中的内置函数- - Build-in Function一、数学运算类abs(x)求绝对值1、参数可以是整型,也可以是复数2、若参数是复数,则返回复数的模complex([real[, imag]])创建一个复数divmod(a, b)分别取商和余数注意:整型、浮点型都可以float

推荐文章

热门文章

相关标签