在使用 web server 渲染 html 模板的时候, 突然看到 server 悄咪咪地塞了一个 csrf_meta_tag()
到 html 文件里. 这是啥?
好端端的 html 文件多了个这:
<meta charset="UTF-8" content="ICVWOGAaO0cHCiNKT2oUYidcNDAqLiA-fKbBUT_-WLj-92p7bnzJDBNI" csrf-param="_csrf_token" method-param="_method" name="csrf-token">
而且 server 还把中间这一段密码一样的东西藏在了服务端. 它究竟想做什么?
仔细查了查生成的 html 和 js 文件, 发现在 js 文件中获取到了这个 csrf-token 的值:
let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute('content')
然后, 在 client 尝试请求 server 的时候, 就需要用到它, 例如, 建立新的 socket 连接:
let liveSocket = new LiveSocket('/live', Socket, { params: { _csrf_token: csrfToken }, hooks: Hooks })
真相终于浮出水面, csrf 的作用就是让 server 可以验证从 client 发来的请求是否来自于 当前用户正在浏览的页面.
有人说, 那我打开页面后把 csrf token 复制走不就行了. 是可以, 但你首先要打开页面.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。