CSRF 介绍

CSRF(Cross-site request forgery),中文名称:跨站请求伪造。
可以在 B 网站利用 A 网站的 cookie 去做一些针对 A 网站的操作,但这用户是没法感知的

攻击方式

举个栗子

小明在 A 网站登录买了一个 8848 钛合金手机,准备在朋友面前装个逼, 美滋滋的下了单,填好收货信息付了款之后没有关闭 A 网站的页签(有时候关了页签 cookie 也还是会存留一段时间的),然后在 B 网站开始溜达, 但是恰好 B 网站就是针对 A 网站做的一个钓鱼网站, 里面有一个按钮链接是修改已经登录了 A 网站用户的收货信息的, 这个链接对小明是迷惑的,比如就是一个链接到 NSFW 网站的地址,小明点了进去然后发送了一条请求(相同的路径和参数)给 A 网站, 因为 A 网站没有做 CSRF 防护, 导致这条请求会携带 A 网站的 cookie, 那么 A 网站会认为这个请求就是该用户发起的, 所以地址修改成功, 到时候小明就是人财两空

核心原理

就是在 B 网站点击一个带有 A 网站请求的链接时, 这条链接会带上 A 网站的 cookie,就相当于你访问了 A 网站的那条链接, 这个时候 cookie 会自动带上的

防护措施

服务端生成一个随机的 csrftoken, 这个只要是随机的都成,
然后用户在登录的时候,把这个值放在响应头的 set-cookie 中,然后客户端在请求接口的时候从 cookie 中拿出这个值,放在请求头的 header 中(不是 cookie 里面,是 header 里面,放到 cookie 里面一点用都没),

B 网站是只能用 A 网站的 cookie,
用的意思是 B 网站只知道在 B 网站访问 A 网站的链接,是可以带上 A 网站的 cookie 的,但是这个 cookie 的内容, B 网站是没法感知的,当然也是不能操作的

所以当把 csrftoken 放到请求 header 中的时候, B 网站中点击 A 网站的链接是没法去传递这个值的, 然后后端再去校验 csrftoken 的值是否正确就行。