2017-01-04 8 views
-1

私は今、奇妙なバグを持っています。私はサーバの出力から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) 

任意のアイデアなぜこれが起こる可能性があり、コードと以下のトレースを参照してください?

答えて

3
for(let i = 0 ; i < object[prop].length ; i++){ 
    object[prop] = xss(object[prop][i]); 
    } 

あなたがループ内でundefinedobject[prop]の値を上書きしています。 object[prop][i]に割り当てようとしたのかもしれませんが、object[prop]の値をundefinedで完全に上書きしています(xssから返されました)。

次のループ反復処理では、停止条件i < object[prop].lengthがテストされ、例外が発生します。あなたの間違った場所でそれをやっているので、すべてのあなたのログは助けにはなりません。の後に、ループ内で上書きすると、object[prop]の値を調べる必要があります。あなたはおそらくだけではなく、あなたのforループのmapを使用する必要があります

注:

object[prop] = object[prop].map(xss) 
+0

が、私はこのようなような愚かな事を知っていた参照してください。乾杯! –

関連する問題