前言
CSRF的全程是Cross Site Request Forgery, 即跨站请求伪造。深入了解CSRF后会发现,这种攻击非常危险,并且很容易就忽视掉。那到底什么是CSRF呢,我们通过一个案例来了解一下
案例
有这么一个简单的后台页面,可以发表、删除以及编辑文章,点击删除的那个按钮,就可以把一篇文章删掉。因为偷懒,想说如果我把这个功能做成 GET,我就可以直接用一个链接完成删除这件事,在前端几乎不用写到任何代码:
<a href='/delete?id=3'>删除</a>
很方便对吧?然后我在后端那边做一下验证,验证 删除的request的cookie 有没有带 session id 上来,也验证这篇文章是不是这个 id 的作者写的,都符合的话才删除文章。
嗯,听起来该做的都做了啊,我都已经做到:「只有作者本人可以删除自己的文章」了,应该很安全了,难道还有哪里漏掉了吗?
没错,的确是「只有作者本人可以删除自己的文章」,但如果他不是自己「主动删除」,而是在不知情的情况下删除呢?你可能会觉得我在讲什么东西,怎么会有这种事情发生,不是作者主动删的还能怎么删?
好,我就来让你看看还能怎么删!
今天假设小黑是一个邪恶的坏蛋,想要让小明在不知情的情况下就把自己的文章删掉,该怎么做呢?
小黑知道小明很喜欢心理测验,于是就做了一个心理测验网站,并且发给小明。但这个心理测验网站跟其他网站不同的点在于,「开始测验」的按钮代码长得像这样:
<a href='https://Livingblog.com/delete?id=3'>开始测试</a>
是不是觉得开始不对劲了?
小明收到网页之后很开心,就点击「开始测验」。点击之后浏览器就会发送一个 GET 请求https://Livingblog.com/delete?id=3,并且因为浏览器的运行机制,一并把 Livingblog.com 的 cookie 都一起带上去。
Server 端收到之后检查了一下 session,发现是小明,而且这篇文章也真的是小明发的,于是就把这篇文章给删除了。
这就是CSRF, 你现在明明在心理测验网站,假设是 https://test.com 好了,但是却在不知情的状况下删除了 https://Livingblog.com 的文章
更有甚者,如果把get请求放在一张看不见的图片链接里:
<img src='https://Livingblog.com/delete?id=3' width='0' height<