在使用 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 复制走不就行了. 是可以, 但你首先要打开页面.


Ljzn
399 声望102 粉丝

网络安全;函数式编程;数字货币;人工智能