我现在有最奇怪的错误;我构建了此函数以消除服务器输出中的xss漏洞,并且在解析MongoDB结果对象(架构中带有子文档)时,数组属性会迅速从数组更改为未定义。请参见下面的代码和跟踪:
代码:
function xss(value){
if(typeof value === "object" && value !== null){
return xssObjectEscape(value);
}else if(typeof value === "string"){
return xssStringEscape(value);
}
}
function xssStringEscape(text) {
return text.replace(/&/g, '&').
replace(/</g, '<'). // it's not necessary to escape >
replace(/"/g, '"').
replace(/'/g, ''');
}
function xssObjectEscape(object) {
for (var prop in object) {
if(typeof object[prop] === "string"){
object[prop] = xssStringEscape(object[prop]);
}else if(Array.isArray(object[prop])){
console.log("xss Array");
console.log(`${prop}: ${JSON.stringify(object[prop])}`);
console.log(object[prop]);
console.log(typeof object[prop]);
console.log(object[prop].constructor);
console.log(object[prop].constructor.name);
console.log(object[prop].length);
for(let i = 0 ; i < object[prop].length ; i++){
object[prop] = xss(object[prop][i]);
}
}else if(typeof object[prop] === "object" && object[prop] !== null){
xssObjectEscape(object[prop]);
}
}
return object;
}
痕迹:
xss Array
save: [null,null,null,null]
[ [Function: notify],
[Function: notify],
[Function: notify],
[Function: notify] ]
object
[Function: Array]
Array
4
TypeError: Cannot read property 'length' of undefined
at xssObjectEscape (/var/www/smq/services/secure/xss.js:30:39)
at xssObjectEscape (/var/www/smq/services/secure/xss.js:34:7)
at xssObjectEscape (/var/www/smq/services/secure/xss.js:34:7)
at xssObjectEscape (/var/www/smq/services/secure/xss.js:34:7)
at xss (/var/www/smq/services/secure/xss.js:5:12)
at filter.user.then (/var/www/smq/handlers/session.js:29:21)
at process._tickCallback (internal/process/next_tick.js:103:7)
知道为什么会发生这种情况吗?
for(let i = 0 ; i < object[prop].length ; i++){
object[prop] = xss(object[prop][i]);
}
您正在循环中覆盖object[prop]
with的值undefined
。您可能打算分配给object[prop][i]
,但实际上您将object[prop]
用的undefined
返回值完全覆盖的值xss
。
下一个循环迭代测试停止条件i < object[prop].length
,并引发异常。您的所有日志记录都无济于事,因为您在错误的位置进行了日志记录。在循环中覆盖object[prop]
后,您应该检查的值。
请注意,您可能应该只使用map
而不是for
循环:
object[prop] = object[prop].map(xss)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句