前言
最近要分享下CSRF的攻防,按说这是个老掉牙的话题,不过我也遇到过非常多一知半解的同学,我自己也经常会被各种条件绕晕,毕竟安全的问题总是灵活非常,所以也算常谈常新
这里我就不讲CSRF的原理了
过程
既然分享就要写个攻防的例子来演示才比较好理解,所以我用koa和host代理加两个页面就写起来了,基本都没啥问题,直到我开始模拟攻击行为
1.get请求
作为一个演示来说,拿get请求来说事到底还是有点过不去,get请求的返回值会被浏览器拦截,但是请求还是会打到服务器,但是现在谁还用get请求来执行写操作呢?
2.post请求
我就想用post,好,先用xhr来试试,不行,浏览器会先发OPTIONS请求,OPTIONS返回的时候就会被浏览器拦住,就算服务器返回的是200 ok也没用,所以后续的POST请求发布出去,好的,我们还有form元素
3.form元素
form元素是个好东西,method可以支持get和post,enctype可以填写post的格式,但是,form不能操作请求头(反正我不知道怎么操作,有会的大佬请告诉我)
另外,在REST规范大行其道的今天,put、update、delete请求我该怎么办?form的method填写这些,在打到node以后会变成get请求。我就只能先用post应付一下吧
并且,form提交是会跳转的,我用createElement加formData的方式进行提交,不直接写form元素也是一样的结果,一个attack页面好好的,点了个按钮就跳转了不合适吧,用户肯定能发现,我记得很多年以前我试过form提交不跳转,但是我忘了怎么处理的,一定不是通过xhr,也许那个属性已经被浏览器干掉了
顺带一嘴,接收到204返回码form也是不会跳转的,但是人家的服务器怎么会给你返回204呢?
4.其他问题
我并没有使用koa-router,只是在koa里手写一个use,用if else 处理所有的请求url,如果我用koa-router,可能光url的严格匹配就能拦住一部分攻击,以及注册的请求类型(上面提到的put、update、delete等)也能拦住很多攻击
更不用说现在用的很多的csrf token和cookie的same-site这些新特性对CSRF攻击的限制了
结语
可能因为我本身不是专业研究安全的,所以对安全领域的知识还停留在很多年以前,有经验的大佬还请不吝赐教
提一句我搭的环境,避免环境不同导致的结果不一致,koa搭服务,监听两个端口,这两个端口用host代理两个域名,一个sheep.com,一个attack.com,koa-send返回两个html文件,分别作为sheep和attack的页面,sheep.com下面种cookie,模拟attack.com跨域的情况