Nodejs 简单 Hybrid App 后端如何防止 CSRF,另外验证码如何实现?

Nodejs 简单 Hybrid App 后端如何防止 CSRF,另外验证码如何实现?

还是打算参加比赛的项目,给自己学校做的App,后端用node.js(Express),客户端主要是Hybrid App。

打算还是用比较传统的cookie+session做用户状态保持,目前有几个问题需要请教: 1.用户提交数据时(例如登录、发帖场景),是否还需要CSRF Token? 若需要,如何实现(目前我只想到了用户进去发帖视图时执行一次http请求,请求token) 2.验证码如何实现(打算做一个“压力控制”,防止广告和灌水。检测用户发帖间隔,少于一定时间就要求填写验证码。但是这个验证码什么时候去请求?比如请求CSRF token的时候,顺便返回一个是否需要验证码的值?比如{“once”: “ThisIsCSRFToken”, needCaptcha: true}) 3.关于防广告、灌水,v2的机制(铜币)似乎不错,但是对于一个学校App是否太重? 4.我是不是想太多了-_-#

请前辈们赐教,如果能提供一些node.js包减少我要造的轮子就更感谢了~!


4 回复

当然可以,以下是根据您的需求编写的回答:


Node.js简单Hybrid App后端如何防止CSRF,另外验证码如何实现?

1. CSRF Token 的实现

在使用传统的 Cookie + Session 方式进行用户状态保持时,CSRF攻击是一个常见的安全威胁。为了防止这种攻击,我们需要在每个表单或AJAX请求中加入CSRF Token。

实现方式:

  • 在每次用户会话开始时生成一个CSRF Token,并将其存储在用户的Session中。
  • 在前端页面加载时通过API请求获取该Token,并将其嵌入到后续的请求中。
  • 在服务器端验证每个请求中的CSRF Token与Session中存储的Token是否一致。

示例代码:

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

const app = express();
app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true
}));

const csrfProtection = csrf({ cookie: true });

app.get('/csrf-token', (req, res) => {
    const token = req.csrfToken();
    res.json({ once: token });
});

app.post('/submit-form', csrfProtection, (req, res) => {
    // 处理表单提交逻辑
    res.send('Form submitted successfully.');
});

2. 验证码的实现

验证码可以用来防止广告和灌水行为。我们可以在用户发帖前检查其发帖频率,并在需要时要求用户填写验证码。

实现方式:

  • 使用一个简单的验证码服务库(如express-captcha)来生成和验证验证码。
  • 在请求CSRF Token的同时,检查用户是否需要填写验证码。

示例代码:

const captcha = require('express-captcha');

app.use(captcha.middleware({
    secret: 'your_secret_key',
    attempts: 3,
    ttl: 300
}));

app.get('/csrf-token', (req, res) => {
    let needCaptcha = false;
    if (req.session.captchaAttempts > 2) {
        needCaptcha = true;
    }
    const token = req.csrfToken();
    res.json({ once: token, needCaptcha });
});

app.post('/submit-form', csrfProtection, (req, res) => {
    if (req.body.captcha && req.session.captcha === req.body.captcha) {
        // 验证成功
        res.send('Form submitted successfully.');
    } else {
        res.status(400).send('Invalid captcha.');
    }
});

希望这些示例代码能够帮助您实现所需的功能。如果您有更多问题,欢迎继续提问!


遇到类似的问题,还没找到答案,楼主解决了么?

好问题! 可惜现在半夜了,大脑转不动了…

对于你的问题,我可以提供一些建议和示例代码:

1. 防止CSRF

使用CSRF Token可以有效地防止跨站请求伪造攻击。在Express应用中,你可以使用csurf中间件来生成和验证CSRF Token。

示例代码:

安装csurf中间件:

npm install csurf

使用csurf中间件:

const express = require('express');
const csrf = require('csurf');

const app = express();
app.use(express.urlencoded({ extended: false }));
app.use(csrf({ cookie: true }));

// 生成CSRF Token
app.get('/csrf-token', (req, res) => {
    return res.json({ once: req.csrfToken() });
});

// 检查CSRF Token
app.post('/submit-form', (req, res, next) => {
    return csrf()(req, res, (err) => {
        if (err) {
            return res.status(403).send('Invalid CSRF Token');
        }
        // 处理表单提交逻辑
        res.send('Form submitted successfully!');
    });
});

2. 实现验证码

你可以使用express-captcha中间件来生成验证码。

示例代码:

安装express-captcha中间件:

npm install express-captcha

使用express-captcha中间件:

const captcha = require('express-captcha');

app.use(captcha({
    secret: 'your-secret-key',
    expiresIn: 60000 // 验证码过期时间,单位为毫秒
}));

app.get('/captcha', (req, res) => {
    const { text, image } = captcha.generate(req);
    req.session.captchaText = text;
    res.set('Content-Type', 'image/png');
    res.send(image);
});

app.post('/submit-form', (req, res) => {
    const userCaptchaText = req.body.captchaText;
    if (!userCaptchaText || userCaptchaText !== req.session.captchaText) {
        return res.status(400).send('Invalid Captcha');
    }
    // 处理表单提交逻辑
    res.send('Form submitted successfully!');
});

总结

通过使用上述的csurfexpress-captcha中间件,你可以在Node.js后端有效地防止CSRF攻击,并实现验证码功能。这样可以提高你的应用安全性,防止广告和灌水行为。希望这些建议对你有所帮助!

回到顶部