当前位置: 首页 > Web前端 > JavaScript

什么是CSRF?什么是有效防御?

时间:2023-03-27 12:21:26 JavaScript

很多工厂在面试的时候喜欢问关于web安全的问题,比如下一个,什么是CSRF,有哪些防范措施?本文将带你了解CSRF。什么是CSRF?(CrossSiteRequestForgery,跨站域请求伪造)是一种网络攻击手段。我们通过一个例子来理解:小明登录银行网站www.bank.com,银行服务器发送一个cookie,Set-Cookie:id=a3fWa;然后小明访问了一个恶意网站www.hacker.com,这个恶意网站里面有一个表单...小明不小心触发了这个form,银行服务器会收到正确的cookie请求,然后银行服务器会执行自己定义的操作转账,这时候就可以转账小明账户里的钱了。具有CSRF特征的攻击一般发生在第三方网站,而不是被攻击网站;攻击利用被攻击网站用户的登录凭证(cookie)伪装成受害者提交操作,而不是直接窃取数据;攻击者无法获取除了使用登录凭证,跨站请求还可以通过多种方式:img图片的src、a标签、form表单提交等;你觉得这很可怕吗?当然很可怕,那么如何防止CSRF攻击呢?您可能会说,如果用户不点击进入恶意网站就可以了。这当然是可以的,但是你不能保证大家不会去点击恶意网站,所以我们还是要做自动防御,即使用户访问了恶意网站,我们也要保证我们的网站不会被攻击。防御措施我们知道CSRF一般发生在第三方网站,攻击者只是利用登录凭证,而不是获取登录凭证数据,所以我们制定如下防御策略:防止访问未知外部域名同源检测同站点Cookie提交时aForm表单,只有添加本域CSRFtoken1才能获取的验证信息。同源检测同源cookie与浏览器的同源策略有区别:*浏览器同源策略:协议、域名、端口相同,即同源;*Cookie同源策略:同域名同源;在HTTP协议中,每个异步请求都会携带两个header来标记源域名:*OriginHeader*RefererHeader浏览器发起请求时,这两个header大部分情况下会自动带上,前端无法修改结尾。服务端收到后,可以根据这两个header判断源的域名;特殊情况:如果Origin和Referer都不存在,建议直接屏蔽,尤其是不使用随机CSRFToken(见下文)作为二次检查时。另外,CSRF大部分情况下来自于第三方域名,但也不能排除这个域名。如果攻击者有权限在该域发表评论(包括链接、图片等),就可以直接对该域发起攻击。在这种情况下,同源策略就起不到保护作用了。总结一下:同源验证是一种比较简单的防御方式,可以防止大部分的CSRF攻击。但这并非万无一失。对于安全要求较高或用户输入内容较多的网站,我们需要对关键接口采取额外的保护措施。2.SamesiteCookie属性从Chrome51版本开始,在浏览器的Cookie中增加了一个新的SameSite属性来防止CSRF攻击。Cookie的Samesite属性用于限制第三方Cookie,从而降低安全风险。它具有三个值:Set-Cookie:SameSite=Strict;设置Cookie:SameSite=Lax;设置Cookie:SameSite=无;严格:最严格,完全禁止第三方cookies,跨站任何情况下都不发送cookies;Lax:限制稍微宽松一些,除了链接、预加载请求和GET表单外,大多数情况下不发送第三方cookie;None:关闭SameSite属性,但必须同时设置Secure属性,如下:Set-Cookie:SameSite=None//InvalidSet-Cookie:SameSite=None;Secure//有效设置Strict或Lax基本可以防止CSRF攻击,前提是浏览器支持SameSite属性。3.CSRFtokenCSRF攻击成功是因为服务器把攻击者携带的cookie当成了正常的用户请求,那么我们可以要求所有的用户请求都携带一个不能被攻击者劫持的token,每个请求都携带这个token,服务器可以通过验证请求是否是正确的令牌来防止CSRF攻击。CSRFtoken保护策略分为三个步骤:将token输出到页面首先,当用户打开页面时,服务器需要为用户生成一个Token,Token通过加密算法对数据进行加密。一般Token包括随机字符串和时间戳的组合,显然提交时Token不能再放在cookie中,否则会被攻击者再次利用。请求中携带token对于GET请求,在请求地址后附加token,如:http://url?token=tokenValue对于POST请求,在Form后添加服务器验证token是否正确。服务端从客户端拿到token后,首先对token进行解密,然后比较随机字符串是否一致,时间是否合法。如果字符串一致且在有效期内,则令牌正确。总结简单总结一下上面CSRF攻击的防护策略:自动防护策略:同源检测(OriginandRefererverification);主动保护策略:token验证,配合SameSite设置;保护页面的幂等性,不要将其包含在GET请求中为了在用户操作中更好的防御CSRF,最佳实践应该是综合考虑以上总结的防御措施的优缺点,做出合适的选择结合目前的web应用本身,才能更好的防止CSRF的发生。