什么是CSRF?
本文参考 原文链接:https://blog.csdn.net/weixin_47450807/article/details/123227342
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
CSRF可以做什么?
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。
CSRF的原理是?
从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:
-
登录受信任网站A,并在本地生成Cookie。
-
在不登出A的情况下,访问危险网站B。
看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:
-
你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
-
你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了…)
-
上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。
我对于 CSRF 的防范的理解就是利用 token 令牌进行身份验证
我们可以当用户请求时,在安全站点A中生成一个SessionId,保存在服务器端,该值可以作为token传递给客户端。客户端可以设置一个隐藏的input框,其中的值为该token,当我们进行请求时,就会将该值传入到站点A的服务器,此时在服务器端就可以进行比较生成的token和保存的token是否一样,如果一样的话,就表示是从安全站点上发出的请求,就做出具体的相应。在危险网站B就无法拿到token,所以也就无法进行正确的请求了。
也可以是在HTTP头中自定义属性并验证
这种方法也是保存token,但是其实和上述不同的是,其在HTTP头部保存token,我们可以一次性给访问该网站的请求都加上该自定义字段,但是如何将数据存放在HTTP中呢?此时我们就需要另一个模块,XHRHTTPRequest,当我们使用该模块时,存在另一个弊端,就是只能是异步请求。
什么是CORS?
CORS(Cross-Origin Resource Sharing, 跨源资源共享) 当一个请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。因此,要想实现CORS进行跨域,需要服务器进行一些设置,同时前端也需要做一些配置和分析。
为什么浏览器要限制跨域?
原因就是安全问题:如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题。比如下面的操作就有安全问题:
- 用户访问www.mybank.com ,登陆并进行网银操作,这时cookie啥的都生成并存放在浏览器
- 用户突然想起件事,并迷迷糊糊地访问了一个邪恶的网站 www.xiee.com
- 这时该网站就可以在它的页面中,拿到银行的cookie,比如用户名,登陆token等,然后发起对www.mybank.com 的操作。
- 如果这时浏览器不予限制,并且银行也没有做响应的安全处理的话,那么用户的信息有可能就这么泄露了。
为什么要跨域?
既然有安全问题,那为什么又要跨域呢? 有时公司内部有多个不同的子域,比如一个是location.company.com ,而应用是放在app.company.com , 这时想从 app.company.com去访问 location.company.com 的资源就属于跨域。
那CSRF和CORS的区别是什么?
CROS(跨域资源共享)和 CSRF(跨站请求伪造)是两个与跨域相关的概念,它们的作用和应用场景有所不同。
CROS是一种浏览器机制,用于在不同域之间共享资源。当一个网页中的JavaScript代码试图从不同源(域、协议或端口)请求资源时,浏览器会执行一个CROS验证。如果服务器允许该请求,将在响应中包含一些特殊的响应头,浏览器会允许JavaScript访问该响应。这样,CROS可以允许在浏览器中跨域访问资源。
CSRF是一种安全漏洞,攻击者可以利用这种漏洞通过冒充用户的身份向其他网站发送恶意请求。攻击者可以在另一个网站(通常是受害者常访问的网站)上构造一个请求,该请求会利用受害者在该网站上的身份验证信息,然后通过用户的浏览器发送该请求。如果受害者已经在目标网站上通过类似“记住密码”功能进行了身份验证,CSRF攻击可能会成功。
总结一下,CROS是一种浏览器机制,用于处理跨域请求,而CSRF是一种安全漏洞,攻击者可以利用该漏洞伪造恶意请求。