CSRF 入门及防御
Posted 二不挂五
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF 入门及防御相关的知识,希望对你有一定的参考价值。
CSRF
入门及防御
CSRF
, Cross-Site Request Forgery ,跨站请求伪造,和 XSS
一样,是web前端面临的主要安全问题。本文主要了解下 CSRF
的原理和常规解决方案。
CSRF 是什么
维基百科 上是这样介绍的:
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法
通常情况下,CSRF攻击的发生,是在这样的情形下(下面说的都是在同一个浏览器下):
你在某个受信任网站 A 登录,保持了登录态,比如在
www.renrendai.com
登录你在同一个浏览器里,访问了某个攻击者的网站 B,比如
www.attack.com
,A 网站有一个接口,没有适当的安全检查,比如有个 投资接口,正常情况下,用户在 A 网站登录后,点击某个购买按钮,就能投资,不用输入密码或是验证码之类的
当你在访问 B 网站的页面时,看上去可能是一部电影,或者一些图片,攻击者这时候,已经在 B 的页面上,调用了 A 网站的 投资接口
你再次回到 A 网站,发现自己莫名其妙就投资了几百块,这还了得,果断打客服骂娘
上面这个解释,对比 维基百科 的介绍来看,正好是,攻击者B,利用你在A网站的登录态,在你不知情的情况下,偷偷的帮你投资了几百块。可以看出,需要被CSRF攻击,在通常情况下,需要以下几个条件:
用户处于登录状态
受信任的web应用,存在接口漏洞
用户访问了攻击者的网站
通过上面也可以看出,CSRF攻击有一个很明显的特征,攻击的执行动作是发生在 B 网站上的,并不是 A网站,请求是直接在攻击者的网站上,向受信任的网站发起。
CSRF,怎么办
Referer 校验
这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。
token 校验
根据 CSRF 攻击原理可以看出,攻击者利用了浏览器的处理cookie的特性,即使在攻击者网站B上,发起对受信任网站A的请求,浏览器也会带上存储在A网站下的cookie值,相当于,攻击者合法地通过浏览器特性,"拿到了" 用户的cookie。那我们是不是可以在受保护的接口里,校验其他的一些字段,一些不能在攻击者网站上读取到的字段。
通常的做法,在渲染页面时,后端会给页面里传一个随机 token
,并把这个 token
记录在 session
中,页面form表单在提交的时候,带上这个 token
,后端在提交的接口里,校验请求参数/请求header的 token
是否和 session
中的相等,只有相等,才认为请求合法。因为这个传到浏览器的 token
值,是放在 页面(html
) 里的,在攻击者的网站上,当然是没办法拿到,因此也就阻挡了 CSRF。
注意,上面这个实现,过于粗陋,根据 koa-csrf
源码里的实现,最好是通过一批 secret
,生成随机的 salt
,来计hash并对比。
同一个 token
使用次数?之前一直在纠结,使用 token
来提交数据,如果其他字段有问题,那 token
是否需要废弃?如果废弃,前端页面里的 token
,怎么获取最新的。根据 koa-csrf
的实现来看,并不需要考虑 token
过期、是否已使用的问题,因为在 CSRF 场景下,token
能生效的前提,就是攻击者拿不到我们的 token
,如果攻击者通过 XSS
或其他手段,能否拿到我们的 token
,那么即使是过期、一次使用作废,也不能解决攻击者重新获取我们新 token
这个问题。
用户输入
除了技术手段外,最后还有个大招,就是在关键的接口,都强制用户输入一个内容,比如 图片验证码, 短信验证码,用户密码 等,这些都涉及到产品体验上的改动,需要和PM UE 等同学确认了。
SameSite Cookie
CSRF攻击依赖了浏览器的对第三方cookie的处理,在新的规范里,cookie上增加了一个标记,可以设置cookie在第三方网站请求时,是否允许浏览器携带上。
相关资料
维基百科-CSRF
浅谈CSRF攻击方式
SameSite Cookie,防止 CSRF 攻击
前后端分离架构下CSRF防护机制
Understanding CSRF
koa-csrf
---- 时2019年1月13日 竣工于帝都望京东
以上是关于CSRF 入门及防御的主要内容,如果未能解决你的问题,请参考以下文章