CSRF攻击

CSRF(跨站请求伪造)攻击

CSRF(Cross Site Request Forgery,跨站请求伪造)是一种近年来才逐渐被大众了解的网络攻击方式,又被称为One-Click Attack或Session Riding。
攻击原理
某用户登录了A网站,认证信息保存在cookie中。当用户访问攻击者创建的B网站时,攻击者通过在B网站发送一个伪造的请求提交到A网站服务器上,让A网站服务器误以为请求来自于自己的网站,于是执行响应的操作,该用户的信息边遭到了篡改.
总结起来就是,攻击者利用用户在浏览器中保存的认证信息,向对应的站点发送伪造请求。用户的认证是通过保存在cookie中的数据实现,在发送请求是,只要浏览器中保存了对应的cookie,服务器端就会认为用户已经处于登录状态,而攻击者正是利用了这一机制。

防范措施

1、正确使用HTTP方法
防范CSRF的基础就是正确使用HTTP方法。在普通的Web程序中,一般只会用到GET和POST方法。而且目前在HTML中仅支持GET和POST方法(借助AJAX则可以使用其他方法)。在使用HTTP方法时,通常应该遵循下面 的原则:

1、 GET方法输入安全方法,不会改变资源状态,仅用于获取资源。页面中所有可以通过链接发起的请求都属于GET请求。

2、 POST方法用户创建、修改和删除资源。在HTML中使用form标签创建表单并设置提交方法为POST,在提交时会创建POST请求。

在GET请求中,查询参数用来传入过滤返回的资源,但是在某些情况下,也可以通过查询参数传递少量非敏感信息。

在删除资源时,应该将删除按钮内嵌在使用了POST方法的form元素中

2、CSRF令牌校验
当处理非GET请求时,要想避免CSRF攻击,关键在判断请求是否来自自己的网站。理论上讲,通过HTTP referrer可以判断原站点从而避免CSRF攻击,但是referer很容易被修改和伪造,所以不能作为主要的防御措施。

除了在表单中加入校验码外,一般的做法是通过在客户端页面中加入伪随机数来防御CSRF攻击,这个伪随机数通过被称为CSRF令牌(token)。

在计算机语境中,令牌(token)指用于标记、验证和传递信息的字符,通常是通过一定算法生成的随机数。

在HTML中,POST方法的请求通过表单创建。我们把在服务器端创建的伪随机数(CSRF令牌)添加到表单中的隐藏字段里和session变量(即签名cookie)中,当用户提交表单时,这个令牌会和表单数据一起提交。在服务器端处理POST请求时,会对表单中的令牌值进行验证,如果表单中的令牌值和seesion中的令牌值相同,就说明请求来自自己的网站。因为CSRF令牌在用户向包含表单的页面发起GET请求时创建,并且在一定时间内过期,一般情况下攻击者无法获取到这个令牌值,所以我们可以有效地区分出请求的来源是否安全。

对于AJAX请求,我们可以在XMLHttpRequest请求首部添加一个自定义字段X-CSRFToken来保存CSRF令牌。

如果程序存在XSS漏洞,那么攻击者可以使用javaScript窃取cookie内容,进而获取CSRF令牌。

3、检测Referer.
所谓Referer,就是在一个网络请求头中的键值对,标示着目前的请求是从哪个页面过来的。服务器通过检查Referer的值,如果判断出Referer并非本站页面,而是一个外部站点的页面,那么我们就可以判断出这个请求是非法的。与此同时,我们也就检测到了一次csrf攻击。但是,服务器有时候并不能接收Referer值,所以单纯地只通过Referer来防御是不太合理的,它因此经常用于csrf的检测。
而且referer也容易被篡改

在这里插入图片描述

CSRF令牌防范原理是什么呢?

需要看下面的知识点

关于token、cookie与session的理解

HTTP协议本身是无状态的,所以需要一个标志来对用户身份进行验证

1.token
用户进行任何操作时,都需要带上一个token

token的存在形式有很多种,header/requestbody/url 都可以

这个token只需要存在客户端,服务器在收到数据后,进行解析

token是无状态的

token是存在cookie中的

2.cookie
用户登录成功后,会在服务器存一个session,同时发送给客户端一个cookie,这个cookie里面有唯一标识该用户的sessionID

数据需要客户端和服务器同时存储

用户再进行请求操作时,需要带上cookie,在服务器进行验证

cookie是有状态的

3.session
存储在服务器端的

保存着用户信息等sessionId,和cookie搭配使用

下面来说一点,csrf的攻击是怎么样的呢,要知道攻击过程中cookie对于攻击者来说都是未知的,不可见的,攻击者能做到的仅仅是借用cookie,但cookie里面具体写了什么,有什么,攻击者是不知道的;而攻击者只是盗用了登录网站的这个cookie来伪造身份去请求,就像攻击者盗用用户的门禁卡一样,那你就好奇了,既然都进门了,那cookie也就无法起到防御的效果了呀;就算是不知道cookie里面有什么,但是攻击者尽管调用就行了,那t存储在cookie里面的token怎么样防御呢!

这就涉及到了cookie的同源策略,同源策略简单来说,就是只有相同域名的网页才能获取到该域名对应的cookie,因为同源策略的限制,当正常用户通过账号密码等方式登陆网站A后,在不注销账号或当前COOKIE失效之前,再次访问网站A时(协议、IP、端口号相同则属于同源)浏览器会自动在HTTP请求包中带上该网站用户登陆后的COOKIE信息··

你在自己的网页上 getCookie可以获取自己的cookie;所以你自己的网站可以获取自己的token,放到input中的隐藏hidden字段

而别人在其他域名无法获取你的cookie,也就无法获取你的token,所以当别人伪造请求时,token和cookie中的token是绝对不一致的;

详情参考美团的csrf攻击文章详解:https://juejin.cn/post/6844903689702866952#heading-18

重点:
为什么将token放在cookie中,因为:cookie, 如果不设置过期时间,cookie保存在内存中,生命周期随浏览器的关闭而结束,如果设置了过期时间,cookie保存在硬盘中,关闭浏览器,cookie数据直到过期时间而消失;cookie是服务器发给客户端的特殊信息,cookie是以文本的形式保存在客户端,每次请求都会带上它(cookie会存储起来,并不是每次登录都会重新生成一个、会重新调用存储的)

区别:

1.在cookie中不能跨域;有同源策略;将 Token 存储在 cookie 中,可以指定 httponly 来防止 js 被读取,也可以指定 secure 来保证 Token 只在 HTTPS 下传输

2.储存在 localStorage 中,每次调用接口时放在http请求头里面,长期有效

3.储存在 sessionStorage 中,每次调用接口时,把它当为一个字段传给后台,浏览器关闭自动清除

基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
token 完全由应用管理,所以它可以避开同源策略

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSRF(Cross-Site Request Forgery)攻击又称为跨站求伪造或者被动式攻击攻击者通过伪造合法用户的求发送到Web应用程序,从而达到不正当的目的。攻击者通常需要诱导用户执行某些操作(如点击链接、访问网站等),以触发CSRF攻击CSRF攻击的工作原理是攻击者构造一个恶意求,然后诱导用户访问带有恶意求的页面。当用户访问该页面时,浏览器会自动发送求到Web应用程序,由于求中包含了用户的合法身份认证信息(如cookie等),Web应用程序无法区分该求是否是用户本人的操作,从而执行了攻击者构造的恶意求。 例如,攻击者可以在某个社交网站上发布一条欺骗性的链接,诱导用户点击该链接。当用户点击链接后,浏览器会自动向Web应用程序发送一条求,该求中包含了用户的身份认证信息和攻击者构造的恶意求。由于Web应用程序无法判断该求是否是用户本人的操作,因此会执行该恶意求,从而导致CSRF攻击成功。 为了防止CSRF攻击,开发者可以采取以下措施: 1. 在关键操作(如修改密码、转账等)中增加CSRF令牌验证,确保求是由合法用户发出的。 2. 对用户输入的数据进行有效的过滤和验证,避免恶意求被执行。 3. 不要在GET求中执行关键操作,避免恶意链接导致的攻击风险。 4. 使用HTTPS协议加密用户的身份认证信息,避免信息被篡改或窃取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值