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)
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。