首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Node.js模块CSURF问题--如何计算反CSRF令牌?

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

Stack Overflow用户
提问于 2021-11-03 02:58:12
回答 1查看 126关注 0票数 0

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

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

代码语言:javascript
复制
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的完整代码

代码语言:javascript
复制
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
  res.json({ csrfToken: req.csrfToken() })
})
 
app.post('/process', parseForm, csrfProtection, function (req, res) {
  res.send('data is being processed')
})
EN

回答 1

Stack Overflow用户

发布于 2021-11-03 03:24:20

对于OWASP (请参阅此URL:https://security.stackexchange.com/questions/209993/csrf-token-unique-per-user-session-why),应在新会话上更改反CSRF令牌对。因此,一旦我注销(删除了我的cookie),就创建了一个新的反CSRF令牌对。

我想知道我是否可以每次都改变这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69819172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档