Nodejs 提交注册信息 无法写入

Nodejs 提交注册信息 无法写入

Express 403 Error: Forbidden at Object.exports.error (/home/node/node/microblog/node_modules/express/node_modules/connect/lib/utils.js:43:13) at Object.module.exports [as handle] (/home/node/node/microblog/node_modules/express/node_modules/connect/lib/middleware/csrf.js:54:41) at next (/home/node/node/microblog/node_modules/express/node_modules/connect/lib/proto.js:190:15) at Object.module.exports [as handle] (/home/node/node/microblog/node_modules/connect-flash/lib/flash.js:20:5) at next (/home/node/node/microblog/node_modules/express/node_modules/connect/lib/proto.js:190:15) at store.get.next (/home/node/node/microblog/node_modules/express/node_modules/connect/lib/middleware/session.js:309:9) at /home/node/node/microblog/node_modules/express/node_modules/connect/lib/middleware/session.js:333:9 at /home/node/node/microblog/node_modules/express/node_modules/connect/lib/middleware/session/memory.js:50:9 at process.startup.processNextTick.process._tickCallback (node.js:244:9)


3 回复

Nodejs 提交注册信息 无法写入

在使用 Node.js 和 Express 开发应用时,有时会遇到提交注册信息失败的情况。你可能遇到了一个常见的问题:403 Error: Forbidden。这通常意味着服务器拒绝了请求,可能是由于 CSRF(跨站请求伪造)防护机制或其他安全设置。

问题分析

在你提供的错误日志中,可以看到 403 Error: Forbidden 是由 CSRF 中间件引起的。Express 默认使用 CSRF 防护来保护应用程序免受跨站请求伪造攻击。如果你没有正确处理 CSRF token,可能会导致这种错误。

解决方案

要解决这个问题,你需要确保在表单提交时包含 CSRF token,并且在后端正确验证该 token。以下是一个简单的示例,展示如何配置和使用 CSRF 中间件。

安装依赖

首先,确保你已经安装了必要的中间件:

npm install express express-session connect-flash csurf
配置 Express 应用

接下来,在你的 Express 应用中进行相应的配置:

const express = require('express');
const session = require('express-session');
const flash = require('connect-flash');
const csrf = require('csurf');

const app = express();

// 设置 CSRF 保护
app.use(csrf({ cookie: true }));

// 使用 session 和 flash 中间件
app.use(session({
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: false
}));

app.use(flash());

// 在模板引擎中暴露 CSRF token
app.use((req, res, next) => {
    res.locals.csrfToken = req.csrfToken();
    next();
});

// 示例路由
app.post('/register', (req, res) => {
    // 处理注册逻辑
    console.log(req.body);
    res.send('Registration successful!');
});

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

在前端表单中,确保包含 CSRF token:

<form action="/register" method="POST">
    <input type="hidden" name="_csrf" value="{{ csrfToken }}">
    <label for="username">Username:</label>
    <input type="text" id="username" name="username">
    <label for="password">Password:</label>
    <input type="password" id="password" name="password">
    <button type="submit">Register</button>
</form>

总结

通过以上步骤,你可以解决 403 Error: Forbidden 错误,并确保注册信息能够正确写入数据库。确保在前端表单中包含 CSRF token,并在后端正确验证它。这样可以有效防止 CSRF 攻击,同时保证应用的正常运行。


提交 Bug 还是到 Github 吧, 论坛没有邮件通知功能, 管理员有时候看不到 https://github.com/cnodejs/nodeclub/issues

根据你提供的错误日志,403 Forbidden 错误通常与 CSRF(跨站请求伪造)保护有关。在 Express 中使用 csurf 中间件时,如果 POST 请求中没有包含正确的 CSRF token,则会抛出该错误。

示例代码

假设你有一个简单的用户注册表单,并且使用了 csurf 中间件来防止 CSRF 攻击。

安装依赖

确保安装了以下包:

npm install express body-parser csurf

示例代码

const express = require('express');
const bodyParser = require('body-parser');
const csrf = require('csurf');

const app = express();

// 使用 bodyParser 解析 post 请求体
app.use(bodyParser.urlencoded({ extended: false }));

// 创建 CSRF 保护中间件
const csrfProtection = csrf({ cookie: true });

// 示例路由
app.get('/register', csrfProtection, (req, res) => {
    // 渲染注册页面,并将 CSRF token 发送给前端
    res.render('register', { csrfToken: req.csrfToken() });
});

app.post('/register', csrfProtection, (req, res) => {
    // 在这里处理提交的注册信息
    console.log(req.body);
    res.send('注册信息已接收');
});

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

前端 HTML 示例

在你的注册表单中,需要添加 CSRF token 作为隐藏字段:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Register</title>
</head>
<body>
    <form action="/register" method="post">
        <!-- CSRF Token -->
        <input type="hidden" name="_csrf" value="{{ csrfToken }}">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username">
        <br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password">
        <br>
        <button type="submit">Register</button>
    </form>
</body>
</html>

解释

  • csurf 中间件生成一个 CSRF token 并存储在 cookie 或 session 中。
  • 当处理 POST 请求时,csurf 中间件检查请求中的 _csrf 参数是否与存储的 token 匹配。
  • 如果不匹配,会抛出 403 Forbidden 错误。

确保在前端表单中正确地包含了 CSRF token。

回到顶部