我使用的是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
res.json({ csrfToken: req.csrfToken() })
})
app.post('/process', parseForm, csrfProtection, function (req, res) {
res.send('data is being processed')
})
发布于 2021-11-03 03:24:20
对于OWASP (请参阅此URL:https://security.stackexchange.com/questions/209993/csrf-token-unique-per-user-session-why),应在新会话上更改反CSRF令牌对。因此,一旦我注销(删除了我的cookie),就创建了一个新的反CSRF令牌对。
我想知道我是否可以每次都改变这一点。
https://stackoverflow.com/questions/69819172
复制相似问题