什么是 CSRF? CSRF的危害和防御方法有一定的参考价值。有需要的朋友可以参考一下,希望对你有所帮助。
什么是 CSRF
在了解 CSRF 之前,我们需要了解两个先决条件。首先是有很多方法可以验证登录权限。目前大部分网站仍然使用会话任务方式。 session机制简单来说就是服务端使用key-value对来记录登录信息,同时在cookie中存储cookie中的session id(也就是刚才提到的key)。此外,我们知道浏览器中的 HTTP(s) 请求会自动为我们上传 cookie 到服务器。这样每次请求时通过cookie获取session id,然后通过它从服务器获取登录信息,完成用户权限的验证。
这也是一个不错的功能。但是由于cookies过于开放,如果用户在A网站登录,如果用户在访问B网站时向A网站发送了请求,那么该请求实际上包含了用户在A网站的登录信息。如果用户此时不知道B站A网站的请求,是非常严重的危害。上述过程是跨站请求攻击,即Cross-Site Request Forgery,即CSRF。
CSRF 的危害
简单总结 CSRF漏洞就是利用网站权限验证中的漏洞在用户不知情的情况下发送请求,从而达到“伪装”用户的目的。使用 CSRF 的攻击者主要包括以下几种类型的攻击:
攻击者可以欺骗受害者用户完成受害者允许的任何状态改变操作,例如:更新账户信息、完成购物、注销甚至登录。
获取用户的隐私数据
与其他漏洞合作
CSRF 蠕虫
其中,CSRF蠕虫,顾名思义,产生蠕虫效应,将CSRF攻击一个一个,十个一个地传播。例如,社区私信好友界面和好友列表获取界面存在CSRF漏洞,攻击者可以将其组合成一个CSRF蠕虫——用户访问恶意页面时,通过以下方式获取其好友列表信息CSRF,然后利用私信好友的CSRF漏洞,向每个好友发送指向恶意页面的消息。只要有人查看此消息中的链接,CSRF蠕虫就会继续传播,可能的危害和影响是巨大的!
防御方法
从上面的描述可以知道,CSRF有两个特点:利用cookie自动携带的特点和跨站攻击。那么针对这两个特点,可以采用以下解决方案。
检查Referer字段
大家都知道HTTP头中有一个Referer字段,用来表示请求来自哪个地址。通过在网站中查看请求的这个字段,我们可以知道请求是否是从这个网站发出的。我们可以拒绝所有不是本站发出的请求,从而避免了CSRF的跨站特性。
const { parse } = require('url');module.exports = class extends think.Logic { indexAction() { const referrer = this.ctx.referrer(); const {host: referrerHost} = parse(referrer); if(referrerHost !== 'xxx') { return this.fail('REFERRER_ERROR'); } }}
同样以ThinkJS为例,在Logic中做一个简单的判断即可。该方法利用了客户端无法构造Referrer这一事实。虽然简单,但是当网站域名有多个,或者域名频繁更换的时候会变得很麻烦,而且也有一定的局限性。
Token验证
由于CSRF利用了浏览器自动传输cookie的特性,另外一个防御思路是不通过cookie传递验证信息,在其他参数中加入随机加密字符串进行验证。这里还有两种方法:
随机字符串:为每次提交添加一个随机字符串参数。服务器通过页面发送参数并将其添加到每个请求的提交参数中。服务器通过检查参数是否一致来判断参数是否一致。用户请求。由于 CSRF 攻击中的攻击者无法事先知道随机字符串的值,因此服务器可以通过验证该值来拒绝请求。
JWT:其实除了session登录,JWT token 登录验证也越来越流行。该方法是在前端记录登录token,通过在每次请求的时候在Header中添加一个认证头来实现登录验证过程。由于攻击者无法知道 CSRF 攻击中的 token 值,因此也可以通过这种方式防止 CSRF 攻击。当然,除了JWT之外,token登录的方式还有很多,比如OAuth。
:CSRF是什么?CSRF有什么危害以及它的防御方法,https://vps.caogenba.com.com/69089.html
如今做站的人不多了,多个朋友多条路子,加入站长论坛和大佬们同道交流,Tips:可以免费打广告哦~ 点击立即加入>>