数组变得不确定

菲利普·赫伯特

我现在有最奇怪的错误;我构建了此函数以消除服务器输出中的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, '&lt;').  // it's not necessary to escape >
     replace(/"/g, '&quot;').
     replace(/'/g, '&#039;');
}

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章