You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js与Express中POST请求体需净化防XSS攻击吗?

必须在服务器端净化输入防范XSS攻击

是的,你必须在服务器端对用户输入进行净化——前端净化完全不可靠,攻击者可以直接绕过前端验证(比如用Postman、curl直接发送构造好的POST请求),把恶意代码提交到你的服务器。而你用innerHTML加载用户内容,一旦有未净化的恶意代码,会直接在其他用户的浏览器中执行,引发XSS攻击(比如窃取Cookie、篡改页面内容等)。

实现方法:用成熟的HTML净化库

推荐使用DOMPurify,这是一个专门用于防范XSS的HTML净化库,支持服务器端使用,能有效过滤所有恶意代码,同时可按需保留合法HTML标签。

步骤1:安装依赖

在Node.js项目中安装DOMPurify和jsdom(服务器端需要jsdom模拟浏览器DOM环境):

npm install dompurify jsdom

步骤2:在后端代码中集成净化逻辑

你有两种选择,各有优劣:

方式1:保存数据前净化(推荐,减少重复处理)

修改POST路由,在保存到MongoDB前净化用户输入:

const createDOMPurify = require('dompurify');
const { JSDOM } = require('jsdom');
const UserData = require('./your-model-path'); // 替换为你的模型实际路径

// 初始化DOMPurify
const window = new JSDOM('').window;
const DOMPurify = createDOMPurify(window);

router.post("/post-data", async (req, res) => {
  // 净化用户输入
  const sanitizedInput = DOMPurify.sanitize(req.body.input);
  await UserData.create({ data: sanitizedInput });
  return res.json({ success: true });
});

router.get("/get-data", async (req, res) => {
  const my_data = await UserData.find();
  return res.json({ data: my_data });
});

方式2:返回数据时净化(适合需保留原始输入的场景)

如果以后可能需要恢复用户原始输入,可在返回数据时再净化:

const createDOMPurify = require('dompurify');
const { JSDOM } = require('jsdom');
const UserData = require('./your-model-path');

const window = new JSDOM('').window;
const DOMPurify = createDOMPurify(window);

router.post("/post-data", async (req, res) => {
  // 保存原始输入
  await UserData.create({ data: req.body.input });
  return res.json({ success: true });
});

router.get("/get-data", async (req, res) => {
  const my_data = await UserData.find();
  // 对每条数据净化后返回
  const sanitizedData = my_data.map(item => ({
    ...item.toObject(),
    data: DOMPurify.sanitize(item.data)
  }));
  return res.json({ data: sanitizedData });
});

额外建议

  • 如果你的场景不需要任何HTML标签,也可以手动转义特殊字符(比如<转&lt;、>转&gt;),但这种方式灵活性差,无法处理嵌套恶意代码,不如DOMPurify全面。
  • 前端可以额外做一层净化作为补充,但永远不要依赖它作为主要防御手段——服务器端净化是最后也是最可靠的防线。

内容的提问来源于stack exchange,提问作者Oscar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:27:23