Nodejs csrf token提交的问题,csurf库

Nodejs csrf token提交的问题,csurf库

var app = express();
app.use(require(‘cookie-parser’)(config.sessionSecret));
app.use(session({
secret: config.sessionSecret,
key:‘sid’,
store: new MongoStore({
db: config.db.name,
host: config.db.host,
port: config.db.port,
username: config.db.user,
password: config.db.pass,
auto_reconnect: true
})
}));
app.use(compress());
app.use(csurf());

这样的配置,照着node-club做的,但是无论怎么提交都提示错误,郁闷。


4 回复

Node.js CSRF Token 提交问题,使用 csurf 库

在 Node.js 中处理 CSRF(跨站请求伪造)保护时,csurf 库是一个非常实用的工具。然而,在实际应用中可能会遇到一些问题,尤其是在配置和使用过程中。以下是一个示例代码,展示如何正确配置和使用 csurf 库,并解决常见的提交问题。

示例代码

首先,确保你已经安装了必要的依赖库:

npm install express cookie-parser session express-session csurf

接下来,编写你的服务器端代码:

const express = require('express');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const csurf = require('csurf');

const app = express();

// 配置 session
app.use(cookieParser(config.sessionSecret));
app.use(session({
    secret: config.sessionSecret,
    key: 'sid',
    store: new MongoStore({
        db: config.db.name,
        host: config.db.host,
        port: config.db.port,
        username: config.db.user,
        password: config.db.pass,
        auto_reconnect: true
    })
}));

// 压缩响应
app.use(express.compress());

// 初始化 CSRF 保护
const csrfProtection = csurf({ cookie: true });

// 使用 CSRF 保护
app.get('/form', csrfProtection, (req, res) => {
    // 在表单中包含 CSRF token
    res.send(`
        <form method="POST" action="/process">
            <input type="hidden" name="_csrf" value="${req.csrfToken()}">
            <button type="submit">Submit</button>
        </form>
    `);
});

app.post('/process', csrfProtection, (req, res) => {
    res.send('Data processed successfully!');
});

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 配置 Session

    • 使用 cookie-parserexpress-session 来管理 session。
    • MongoStore 用于将 session 数据存储到 MongoDB。
  2. 初始化 CSRF 保护

    • 使用 csurf 中间件来启用 CSRF 保护。
    • cookie: true 表示 CSRF token 将通过 cookie 发送。
  3. 生成 CSRF Token

    • 在 GET 请求处理函数中,通过 req.csrfToken() 生成 CSRF token,并将其嵌入到表单中。
  4. 验证 CSRF Token

    • 在 POST 请求处理函数中,使用 csrfProtection 中间件来验证 CSRF token。
    • 如果 token 匹配,则继续处理请求;否则,返回一个错误。

常见问题及解决方法

  1. CSRF Token 未生成或未发送

    • 确保在表单中正确嵌入了 CSRF token。
  2. CSRF Token 不匹配

    • 确保客户端发送的 CSRF token 与服务器生成的 token 一致。
  3. Cookie 设置问题

    • 检查是否正确设置了 cookie-parserexpress-session 的配置。

通过以上步骤,你应该能够成功地在 Node.js 应用中使用 csurf 库来处理 CSRF 保护,并避免常见的提交问题。


錯誤提示?

已解决。 得使用body-parser

在使用 csurf 库时,需要确保正确地生成 CSRF Token 并将其包含在请求中。以下是一个完整的示例代码,展示了如何设置和验证 CSRF Token。

示例代码

const express = require('express');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);
const csurf = require('csurf');

const app = express();

// 配置存储
const store = new MongoDBStore({
    uri: 'mongodb://localhost:27017/yourdb',
    collection: 'sessions'
});

// 中间件配置
app.use(cookieParser('your-secret-key'));
app.use(session({
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: false,
    store: store
}));

// 使用 csurf
const csrfProtection = csurf({ cookie: true });

app.get('/', (req, res) => {
    res.send(`
        <form action="/process" method="POST">
            <input type="hidden" name="_csrf" value="${req.csrfToken()}">
            <button type="submit">Submit</button>
        </form>
    `);
});

app.post('/process', csrfProtection, (req, res) => {
    res.send('Data processed');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 中间件配置:

    • cookie-parser 用于解析 cookies。
    • express-session 用于会话管理。
    • csurf 用于生成和验证 CSRF Token。
  2. 路由处理:

    • GET /: 渲染表单,并将 CSRF Token 作为隐藏字段添加到表单中。
    • POST /process: 使用 csrfProtection 中间件来验证 CSRF Token。
  3. CSRF Token:

    • 在表单中,使用 req.csrfToken() 方法生成 CSRF Token。
    • csrfProtection 中间件会自动检查 POST 请求中的 _csrf 参数是否与 Cookie 中的 CSRF Token 匹配。

通过这种方式,可以确保每个表单提交都包含有效的 CSRF Token,从而提高安全性。

回到顶部