登录

Node.js模块CSURF问题--如何计算反CSRF令牌?

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 提问于2021-11-03

我使用的是node.js模块CSURF,它被配置为通过cookie解析器使用cookie。

出于演示目的,我只是在/form GET请求中将反CSRF令牌回显到屏幕。下面是通过VS Code Rest客户端插件的请求和响应:

GET http://localhost:9000/form HTTP/1.1
User-Agent: vscode-restclient
accept-encoding: gzip, deflate
cookie: sid=s%3AYdAxaIHCvv38D6vd3VOi085SOzqkuZpN.eloHBwtgNm4yXQia3FtgR6puNj48kNZVbxlWtBZhSk0; _csrf=xdfFevA7j1qcGRo5BvB7JDQ2
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Security-Policy: default-src 'self';base-uri 'self';block-all-mixed-content;font-src 'self' https: data:;frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests
X-DNS-Prefetch-Control: off
Expect-CT: max-age=0
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
X-XSS-Protection: 0
Content-Type: application/json; charset=utf-8
Content-Length: 52
ETag: W/"34-4PDt3TpquKFR5AlQtYw1wqZJRD4"
Date: Wed, 03 Nov 2021 02:47:01 GMT
Connection: close
  "csrfToken": "HhEOYbdx-lhbaEmFT_Udx-CyyZFvuXG2u3lI"
}

您可以在cookie中看到_csrf的值-- xdfFevA7j1qcGRo5BvB7JDQ2

有趣的是,这与屏幕的标记输出不匹配-- HhEOYbdx-lhbaEmFT_Udx-CyyZFvuXG2u3lI

因此,我假设这是一个加密匹配,或者在CSRF值中添加了一个盐,以便每次生成唯一的反_csrf令牌。

...which很好,当我使用HhEOYbdx-lhbaEmFT_Udx-CyyZFvuXG2u3lI发出POST请求时,b/ CSURF工作。

当我向/form端点发出一个新的GET请求时,问题/混淆就开始起作用了。CSRF值(xdfFevA7j1qcGRo5BvB7JDQ2)没有改变,只有输出到屏幕上的反_csrf标记。

所以看起来反CSRF令牌在每次请求时都会改变,但是cookie值不会改变。这是正确的行为吗?它看起来不像b/c,我总是能够使用任何反CSRF令牌来绕过检查。

以下是CSURF URL https://www.npmjs.com/package/csurf 的完整代码

var cookieParser = require('cookie-parser')
var csrf = require('csurf')
var bodyParser = require('body-parser')
var express = require('express')
// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })
// create express app
var app = express()
// parse cookies
// we need this because "cookie" is true in csrfProtection
app.use(cookieParser())
app.get('/form', csrfProtection, function (req, res) {
  // changed original code to display token to screen instead of render it within a form; this is for dev purposes only