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

如何在服务端清理API响应?Express XSS漏洞修复咨询

修复Express请求处理器中的XSS漏洞

问题原因

尽管调用的是内部可信端点,但用户提交的email输入可能未经过滤就被包含在newResponse.data中,直接通过res.send()返回时,浏览器会将内容当作HTML解析,从而触发XSS攻击。

修复方案

1. 若返回JSON数据:改用res.json()替代res.send()

res.json()会强制设置响应的Content-Type为application/json,浏览器不会将其解析为HTML,从根源避免XSS风险。

export const Handler = async (req: Request, res: Response, next: NextFunction) => {
  const { newResponse } = await newFunctionWithRequest(req)
  res.json(newResponse.data) // 替换res.send为res.json
}

2. 若需返回HTML内容:对输出进行HTML转义

使用专门的HTML转义库(如escape-html)对返回内容进行处理,将特殊字符(如<、>、&等)转换为实体编码,防止浏览器解析为恶意HTML。

首先安装依赖:

npm install escape-html

修改代码:

import escapeHtml from 'escape-html';

export const Handler = async (req: Request, res: Response, next: NextFunction) => {
  const { newResponse } = await newFunctionWithRequest(req)
  // 转义HTML内容,确保安全输出
  const sanitizedContent = escapeHtml(newResponse.data.toString())
  res.send(sanitizedContent)
}

3. 前置用户输入验证与清理

在请求进入业务逻辑前,对用户提交的email进行格式验证和HTML转义,确保传入可信端点的内容本身是安全的,形成多层防护。

使用express-validator实现验证:
首先安装依赖:

npm install express-validator

修改代码:

import { body, validationResult } from 'express-validator';

// 定义邮箱验证与清理中间件
export const validateEmailInput = [
  body('email')
    .isEmail().withMessage('请输入有效的邮箱地址')
    .escape() // 转义HTML特殊字符
];

export const Handler = async (req: Request, res: Response, next: NextFunction) => {
  // 检查验证结果
  const validationErrors = validationResult(req);
  if (!validationErrors.isEmpty()) {
    return res.status(400).json({ errors: validationErrors.array() });
  }

  const { newResponse } = await newFunctionWithRequest(req)
  res.send(newResponse.data)
}

方案选择建议

  • 若你的接口是返回数据的API,优先选择方案1,这是最简洁且安全的方式;
  • 若必须返回HTML内容,使用方案2对输出进行转义;
  • 无论哪种场景,方案3的前置验证都是推荐的基础防护手段,能在请求入口处过滤恶意输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:57:47