Node.js 安全防护:XSS、CSRF 和 SQL 注入

Node.js 是一个强大且流行的构建 Web 应用程序的环境。然而,与任何 Web 技术一样,它容易受到安全威胁,常见的包括 XSS、CSRF 和 SQL 注入。了解这些漏洞并实施强大的防御对于任何 Node.js 开发人员都至关重要。

跨站脚本 (XSS)

XSS 攻击涉及将恶意脚本注入其他用户查看的网页中,而这些脚本可以窃取用户数据、模拟用户执行操作并危及用户数据安全。常见的解决办法:

  1. 转义用户输入
  2. 内容安全策略 (CSP)
  3. 验证和清理输入

转义用户输入

在将用户输入呈现在页面上之前,始终转义用户输入,可以使用 escape-html 等库来完成。

ini 复制代码
const escapeHtml = require("escape-html");

// example values
const desc = "I <b>think</b> this is good.";
const fullName = 'John "Johnny" Smith';

// example passing in text into a html attribute
console.dir('<input name="full_name" value="' + escapeHtml(fullName) + '">');
// -> '<input name="full_name" value="John &quot;Johnny&quot; Smith">'
// example passing in text in html body
console.dir('<textarea name="desc">' + escapeHtml(desc) + "</textarea>");
// -> '<textarea name="desc">I &lt;b&gt;think&lt;/b&gt; this is good.</textarea>'

内容安全策略 (CSP)

实施 CSP Headers 以限制浏览器运行未经授权的脚本,可以使用 helmet 库来完成。

javascript 复制代码
import express from "express";
import helmet from "helmet";

const app = express();

// Use Helmet!
app.use(helmet());

app.get("/", (req, res) => {
    res.send("Hello world!");
});

app.listen(8000);

验证和清理输入

使用库 express-validator 来验证和清理输入数据。

javascript 复制代码
const { body, validationResult } = require("express-validator");

app.post("/comment", [body("comment").trim().escape()], (req, res) => {
    // handle the request
});

跨站请求伪造 (CSRF)

CSRF 攻击诱骗用户提交恶意请求,它们对于根据用户输入执行状态更改操作的应用程序尤其危险。常见的解决办法:

  1. 使用 CSRF 令牌
  2. 同站点 Cookie 规则

使用 CSRF 令牌

tiny-csrf 支持在客户端加密 cookie 以防止恶意攻击者查看。但使用这个库并不意味着解决了所有 CSRF 带来的安全隐患, 如果有非常强烈的安全需求(例如大规模生产应用程序、敏感信息、发出许多后端请求的单页应用程序),请参阅 OWASP 安全 并实施更严格的安全性。

php 复制代码
const csurf = require("tiny-csrf");
const express = require("express");
const session = require("express-session");

let app = express();

app.use(express.urlencoded({ extended: false })); 
app.use(cookieParser("cookie-parser-secret"));
app.use(session({ secret: "keyboard cat" }));
// order matters: above three must come first
app.use(csurf("123456789iamasecret987654321look"));

使用库 express-session 设置 cookie 的 SameSite 属性,以防止浏览器随跨站点请求一起发送 cookie。

php 复制代码
const session = require("express-session");
app.use(session({ cookie: { sameSite: "strict" } }));

SQL 注入

SQL注入涉及通过用户输入插入或操纵SQL查询,从而允许攻击者访问或修改数据库信息。常见的解决办法:

  1. 使用参数化查询
  2. 使用 ORM/ODM 库

使用参数化查询

在应用开发中避免将用户输入直接插入到 SQL 查询中,使用参数化查询来分离 SQL 逻辑和用户输入。

ini 复制代码
const mysql = require("mysql");
const connection = mysql.createConnection(/* config */);
const userInput = "user input";
connection.query(
    "SELECT * FROM users WHERE id = ?",
    [userInput],
    (error, results) => {
        // handle results
    }
);

使用 ORM/ODM 库

使用 ORM(对象关系映射)或 ODM(对象文档映射)库,如 Sequelize 或 Mongoose,它们本质上处理参数化查询。

ini 复制代码
const User = require("./models/user");
User.findAll({ where: { username: req.body.username } });

其他安全措施

  • 定期更新依赖项:定期更新依赖项以修补已知漏洞。
  • 日志记录和监控:实施日志记录和监控以快速检测和响应可疑活动。
  • HTTPS:使用 HTTPS 加密传输中的数据。
  • 安全 Headers:利用 X-Frame-OptionsX-Content-Type-Options 等 HTTP 头来增强安全性。

总结

在 Node.js 开发中,安全永远不应该是事后才想到的。通过了解和减轻 XSS、CSRF 和 SQL 注入等风险,可以构建更强大、更安全的应用程序。

相关推荐
前端付豪2 小时前
必知Node应用性能提升及API test 接口测试
前端·react.js·node.js
王同学 学出来2 小时前
vue+nodejs项目在服务器实现docker部署
服务器·前端·vue.js·docker·node.js
源猿人3 小时前
使用 Node.js 批量下载全国行政区 GeoJSON(含省级 + 地级市)
node.js
_Kayo_5 小时前
Node.JS 学习笔记7
笔记·学习·node.js
给勒布朗上上对抗呀6 小时前
XSS实战-Bugku-zombie-10
ctf·xss
程序员爱钓鱼7 小时前
Node.js 编程实战:博客系统 —— 用户注册登录与文章管理
前端·后端·node.js
JaredYe8 小时前
用 Node.js 从旧版 PPT 中提取文本:轻量开源工具 ppt-to-text
node.js·powerpoint·ppt
TDengine (老段)8 小时前
TDengine Node.js 语言连接器入门指南
大数据·开发语言·物联网·node.js·vim·时序数据库·tdengine
余道各努力,千里自同风8 小时前
node.js 操作 MongoDB
数据库·mongodb·node.js