javascript 如何清理API响应服务器端?

yqyhoc1h  于 2023-06-28  发布在  Java
关注(0)|答案(3)|浏览(103)

我有一个Express请求处理程序,它接受一个请求,其中包括用户表单输入(email),向我的另一个(受信任的)端点发出请求(通过newFunctionWithRequest),然后从新的响应(newResponse)返回数据。

export const Handler = async (req: Request, res: Response, next: NextFunction) => {
  const { newResponse } = await newFunctionWithRequest(req)
  res.send(newResponse.data) // Snyk identifies this line as the problem
}

Snyk已识别XSS vulnerability

Unsanitized input from the HTTP request body flows into send, where it is used to render an HTML page returned to the user. This may result in a `Cross-Site Scripting attack (XSS)`

如何修复此漏洞?

jm81lzqq

jm81lzqq1#

我建议从请求对象req中获取特定的元素,然后将它们传递给newFunctionWithRequest函数。这意味着函数不会接收任何它不期望的东西。
例如:

export const Handler = async (req: Request, res: Response, next: NextFunction) => {
    const { email, password } = req.body;
    const { newResponse } = await newFunctionWithRequest({ email, password });
    res.send(newResponse.data);
}

您还可以验证它是否是正确的类型,并根据需要对其进行清理。
另一种选择是使用Joi这样的库来验证传入的请求。

bxgwgixi

bxgwgixi2#

当我有类似的需求时,我创建了自定义中间件,您可以将其集成到任何端点(或全局地针对每个请求),它将检查请求body中的任何输入是否有问题。
它将检查是否:

  • 输入包含一些嵌入的HTML代码(例如图像脚本)。
  • 第一个非白色字符是=,这使得Excel导入容易受到攻击。
    中间件
const containsHtml = /<[^>]*>/;
const startsWithEqual = /^\s*=/;

const isInvalidInput = (input) => {
  return containsHtml.test(input) || startsWithEqual.test(input);
}

exports.inputValidator = (req,res,next) => {
  let invalid_input_count = 0;
  const obj = req.body;
  const stack = [obj];
  while (stack?.length > 0) {
    const currentObj = stack.pop();
    Object.keys(currentObj).forEach(key => {
      if (typeof currentObj[key] === 'object' && currentObj[key] !== null) {
        stack.push(currentObj[key]);
      } else {
        if (typeof currentObj[key] === 'string' && isInvalidInput(currentObj[key])) {
          invalid_input_count++;
        }
      }
    });
  }

  if(invalid_input_count === 0) {
    return next();
  } else{
    return res.status(400).json({ success: false, error_code: 'invalid_input'});
  }
}

用法

const express = require('express');
const { inputValidator } = require('./util/input-validator');

...

const app = express();
app.use(inputValidator); // Check every request for vulnerable inputs
whlutmcx

whlutmcx3#

DOMPurify支持服务端和客户端。

我相信这就是你要找的那种图书馆。
https://github.com/cure53/DOMPurify

相关问题