如何更安全的用Node.js开发web应用

如何更安全的用Node.js开发web应用

此文是我们即将出版的新书的一个章节,本章是由我编写的,主要讲述了利用Node.js进行web开发会面临的一些安全方面的问题,我想这些知识,无论是否购买我们出版的新书的Node.js爱好者及开发都应该知道的东西,文中的错误和遗漏欢迎各位大大通过pull request或者留言指正,章节访问地址: https://github.com/DoubleSpout/threadAndPackage/blob/master/web_safety.md

另外如果你想了解Node.js的线程和进程的详情请看这里: https://github.com/DoubleSpout/threadAndPackage/blob/master/thread_and_process.md

对如何利用libuv发布一个多线程Node.js开发的Package请看这里: https://github.com/DoubleSpout/threadAndPackage/blob/master/create_a_package.md

另外请各位github用户follow下我的帐号doublespout哦~.

写这几章节,前后校对这些文字真的耗费很多精力和时间,希望各位Node.js爱好者尊重一下我的劳动成果,看完就行,不要转载

我们都是为了推进Node.js中文资料的丰富,文中有什么不对的地方欢迎指出。


29 回复

如何更安全地使用 Node.js 开发 Web 应用

本文将讨论如何更安全地使用 Node.js 进行 Web 开发。尽管 Node.js 是一个强大的工具,但在开发过程中可能会遇到各种安全问题。以下是一些关键的安全实践和示例代码,帮助你构建更安全的应用。

1. 使用 HTTPS

HTTPS 可以保护数据在客户端和服务器之间的传输安全。你可以使用 express 框架配合 https 模块来设置 HTTPS。

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();

const options = {
    key: fs.readFileSync('/path/to/privatekey.pem'),
    cert: fs.readFileSync('/path/to/certificate.pem')
};

https.createServer(options, app).listen(443);

2. 防止 XSS 攻击

XSS(跨站脚本攻击)可以通过多种方式注入恶意脚本。使用 helmet 中间件可以有效地防止 XSS 攻击。

const helmet = require('helmet');

app.use(helmet());

3. 防止 SQL 注入

SQL 注入是一种常见的攻击方式。使用预编译语句或 ORM(对象关系映射)可以有效避免这种风险。

const { Pool } = require('pg');

const pool = new Pool({
    user: 'your-user',
    host: 'localhost',
    database: 'your-database',
    password: 'your-password',
    port: 5432,
});

async function getUserById(id) {
    const client = await pool.connect();
    try {
        const result = await client.query('SELECT * FROM users WHERE id = $1', [id]);
        return result.rows[0];
    } finally {
        client.release();
    }
}

4. 输入验证

确保所有输入都经过严格的验证。使用 express-validator 可以方便地实现这一点。

const { check, validationResult } = require('express-validator');

app.post('/register', [
    check('username').isLength({ min: 5 }),
    check('email').isEmail(),
    check('password').isStrongPassword()
], (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
    }

    // 处理注册逻辑
});

5. 使用 JWT 进行认证

JSON Web Tokens (JWT) 是一种常用的身份验证机制。使用 jsonwebtoken 库可以方便地生成和验证 JWT。

const jwt = require('jsonwebtoken');
const secret = 'your-secret-key';

function generateToken(user) {
    return jwt.sign({ userId: user.id }, secret, { expiresIn: '1h' });
}

function authenticateToken(req, res, next) {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1];

    if (token == null) return res.sendStatus(401);

    jwt.verify(token, secret, (err, user) => {
        if (err) return res.sendStatus(403);
        req.user = user;
        next();
    });
}

通过遵循上述建议并使用这些库和中间件,你可以显著提高你的 Node.js Web 应用的安全性。希望这些信息对你有所帮助!


start & follow

woooo 现在连写书都git了呀。。。

刚刚看完,非常不错。另外楼主有没有时间整理一下关于node应用在nosql方面的安全知识?

不错,followed

早已经follow! ps:只出安全这方面的啊

好文章,受益匪浅~

必须顶

[XSS](javascript:alert(‘XSS’))

预览还有的xss,发布就过滤掉了,好评。

followed

额,nosql注入比较有局限, 好像没什么东西吧

新书会涵盖node.js的各种方面,这只是部分章节

大部分还是真实的

有收货就行

屌爆,又是重磅书,期待,求提前review权限

支持,出书了一定买!

另外有个质疑,文章 Node.js的线程和进程 中, php模型的图中,多个用户request指到了同一个apache,这样会有误导吧?应该是每个用户request对应一个apache线程或进程。

支持,內容很扎實,關注,加上持續關注 github

非常实用的书,请问可现在立即购买抢先阅读 preview 版吗?

建议可放上 leanpub.com 贩售,启续发布更新也方便些,多谢。

微博上私信你~嘿嘿

额,这个图主要就是表示apache是一个web服务器,在前端先处理用户请求

这个就算preview版吧,等全书上架了再说吧~

写得好,赞……

支持阿~~~ 请问书名是什么? 何时上架?

asdfwaef

mark

受教匪浅 有什么模块可以帮助屏蔽各种攻击吗?

引出问题层层深入,一看即懂;解决问题抽丝剥线,一顺到底;相当精彩!!

为了确保Node.js Web应用的安全性,可以从以下几个方面着手:

  1. 使用HTTPS
    使用HTTPS可以保护数据传输过程中的安全性。你可以使用express中间件helmet来简化HTTPS配置。

    const express = require('express');
    const helmet = require('helmet');
    
    const app = express();
    app.use(helmet());
    
  2. 输入验证
    使用express-validator来处理表单数据的验证,防止SQL注入和XSS攻击。

    const { check, validationResult } = require('express-validator');
    
    app.post('/submit', [
        check('username').isLength({ min: 5 }).withMessage('用户名太短'),
        check('password').isLength({ min: 8 }).withMessage('密码太短')
    ], (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() });
        }
        // 处理正常逻辑
    });
    
  3. 使用安全的认证机制
    推荐使用Passport.js库,它支持多种认证策略,如本地认证、OAuth等。

    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    
    passport.use(new LocalStrategy(
      function(username, password, done) {
          User.findOne({ username: username }, function (err, user) {
              if (err) { return done(err); }
              if (!user) { return done(null, false); }
              if (!user.verifyPassword(password)) { return done(null, false); }
              return done(null, user);
          });
      }
    ));
    
  4. 避免直接暴露数据库凭证
    将敏感信息(如数据库连接字符串)存储在环境变量中,而不是直接硬编码在代码中。

    const dbConfig = {
        connectionString: process.env.DATABASE_URL
    };
    
  5. 错误处理
    避免向客户端泄露详细的错误信息,这可能暴露系统内部结构。

    app.use((err, req, res, next) => {
        console.error(err.stack);
        res.status(500).send('Something broke!');
    });
    
  6. 定期更新依赖
    使用npm audit命令检查并更新过时的依赖项,以防止潜在的安全漏洞。

以上措施可以帮助提高Node.js Web应用的安全性。

回到顶部