在上一篇文章中,我们了解了XSS攻击的内容,在这一篇文章中就准备讲解关于 CSRF攻击 的内容,废话不多说,开搞!
什么是CSRF攻击
CSRF(cross site request forgery),翻译过来就是 跨站请求伪造,主要是通过 第三方 网站拿到用户的 登录凭证,然后向被攻击的网站发送伪造请求,从而达到攻击的目的
这种攻击方式与XSS攻击最大的不同点在于CSRF攻击是在 第三方网站 上对目标网站实施攻击,而XSS攻击是直接在 目标网站 上实施攻击
CSRF攻击有哪些类型
CSRF攻击的类型主要分为三种
- GET类型,这种类型的攻击方式非常简单,直接通过一个img标签的形式就可以达到攻击的目的,形如
<img src="www.test.com" />
- POST类型,这种类型主要是通过构造一个 自动提交 的表单来实现,示例如下:
1 | <form action="http://www.test.com" method="POST"> |
- 链接类型,这种类型主要是通过构造一个 链接 来实现,通常会以有吸引力的图片或者夸张的文本的形式来展示,这样只要用户点击了类似的链接就会中招,与上述两种方式不同点在于这种方式是在目标网站上实施的攻击
CSRF攻击有哪些特点
通过上文的讲解,可以归纳出如下的特点
- 攻击通常发生在第三方网站上,但是如果目标网站有易于实施攻击的模块,类似评论功能,那么也会直接在目标网站上发起攻击
- 黑客不是 直接 获取用户的登录凭证,而只是钻了浏览器对于cookie使用的空子,冒用了它
- 跨站请求可以用各种方式:图片URL、超链接、Form提交等等,表现形式多种多样,并且还是在第三方网站上进行实施,所以预防难度较高
如何防范CSRF攻击
我们已经知道了CSRF攻击是如何进行实施的,那么如何防范就可以根据它的特点进行制定,对于CSRF攻击的防护措施主要有如下几种方案
- 设置cookie的 samesite 属性,这个属性有三个值可选
- Strict: 表明cookie不会被任何第三方网站所使用,目标网站通过新标签重新打开也不会携带,彻底杜绝了冒用cookie的可能性
- Lax: 除了页面之间通过链接跳转可以被使用,其他情况均不能被使用
- None:任何第三方都可以使用该cookie,这也是风险的源头
通常情况下,可以设置为Lax来一定程度避免风险,为什么不直接设置Strict呢?因为如果设置为Strict,那么登录过的网站通过超链接重新打开时,因为cookie的不可用,所以会导致用户登录状态的丢失,从而影响用户体验
需要注意的是目前只有chrome和firefox支持该功能,并且不支持子域,也就是说主域下的 samesite-cookie 无法被子域所使用
同源检测,根据请求头中的 origin 和 referer 来判断发起请求的源是否合法,这种方式存在如下缺点
- 请求的header是可以被伪造的,因此不完全可信
- 如果CSRF攻击是从目标网站上实施的,那么该方式就会失效
- 容易将一些合法的第三方请求当作CSRF攻击,从而被拒绝掉
CSRF-TOKEN,这种方式就是让服务器在返回的html文档中以某种方式嵌入一个token,之后所有的请求都需要带上这个token,从而验证合法性。由于攻击者无法获取到该token,因此攻击者发出的请求都会被拒绝掉
对于用户上传的内容做校验与过滤,防止恶意内容被存储
用户打开第三方链接时,需告知风险
结语
关于web攻击内容的讲解就全部结束了,当然这也只是冰山一角,还有很多东西没涉及到。做程序员这一行就是需要不断学习,才能跟上技术发展的脚步,所以,加油吧,骚年!