Node.js+Express请求体非法字符检测:无法处理嵌套对象
解决嵌套对象的非法字符检测问题
没错,递归确实是处理任意层级嵌套数据的最优方案——你的原代码只遍历了顶层属性,遇到嵌套对象时只会把它转成字符串(比如"[object Object]"),根本不会检查内部的字段。我们只需要修改hasBadInput函数,让它遇到对象或数组时递归自身,就能覆盖所有嵌套层级了。
修改后的完整代码
var badStrings = ["'", '"', '<', '>']; if (hasBadInput(req.body)) { // 检测到非法输入 return res.status(400).send("BAD REQUEST"); } function hasBadInput(requestParams) { // 处理数组:遍历每个元素检查 if (Array.isArray(requestParams)) { for (const item of requestParams) { if (hasBadInput(item)) { return true; } } return false; } // 处理对象:遍历每个属性 if (typeof requestParams === 'object' && requestParams !== null) { for (const key in requestParams) { if (Object.prototype.hasOwnProperty.call(requestParams, key)) { const value = requestParams[key]; // 如果值是对象/数组,递归检查;否则直接检查是否包含非法字符 if ((typeof value === 'object' && value !== null) || Array.isArray(value)) { if (hasBadInput(value)) { return true; } } else if (value && isBadInput(value)) { return true; } } } return false; } // 如果是原始类型,直接检查 return requestParams && isBadInput(requestParams); } function isBadInput(value) { const strValue = String(value); // 统一转成字符串 for (const badStr of badStrings) { if (strValue.includes(badStr)) { return true; } } return false; }
关键改动说明
- 数组处理:新增了
Array.isArray的判断,确保数组里的每个元素(不管是原始值还是嵌套对象/数组)都被检查到 - 递归逻辑:当遍历到的
value是对象(且不是null)或数组时,递归调用hasBadInput,深入嵌套层级 - 类型安全:增加了
requestParams !== null的判断,避免把null误当成对象处理(因为typeof null === 'object') - 可读性优化:把
value += ""改成String(value)更直观;用includes替代indexOf > -1,代码逻辑更清晰
这样修改后,不管你的req.body有多少层嵌套,甚至包含数组结构,所有字段都会被逐一检查非法字符,完全满足你的需求。而且正如你所说,这段代码只做检测不做 sanitize,完美适配你的场景。
内容的提问来源于stack exchange,提问作者Ashutosh
相关产品推荐
相关产品推荐

