4

Node.js と Underscore.js を使用しています。サーバー側とクライアント側のどちらで JSON データをエスケープするかを判断できません。アンダースコアは、構文では補間された値を自動エスケープしません<%= someValue %><%- someValue %>、EJS とは対照的であり、混乱を引き起こす可能性があります。GitHub に問題があり、自動エスケープ バージョンのコミットもありました。しかし、問題の下のコメントは次のように述べています。

私は、エスケープはテンプレート言語よりもデータの近くで行うべきであるという一般的な哲学を持っています

では、AJAX データへの HTML エスケープをいつ行うのがよいかという提案はありますか? 私が使用しているサーバー側のヘルパー関数は次のとおりです。

var htmlEscape = function(html){
    return String(html)
    .replace(/&(?!\w+;)/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;');
};
var xss = function(obj) {
    if (obj instanceof Array) {
        for (var i = 0; i < obj.length; i++) {
            obj[i] = xss(obj[i]);
        }
    } else {
        for(var key in obj) {
            // key != '_id' for mongoose doc
            if(obj[key] instanceof Object && !(obj[key] instanceof String) 
                && !(obj[key] instanceof Function) && key != '_id') {
                obj[key] = xss(obj[key]);
            } else if (obj[key] instanceof String || typeof(obj[key]) == "string") {
                obj[key] = htmlEscape(obj[key]);
            } else {
                obj[key] = obj[key];
            }
        }
    }
    return obj;
};

次に、JSON を返すたびに呼び出します。

res.json(xss(someData));
4

1 に答える 1

1

誰もがクライアント側のコードをいじって、好きな方法でデータを送信できるため、サーバーでサニタイズ/エスケープ操作を実行することをお勧めします。

優れたnode.jsモジュールであるnode-validatorがあります。このモジュールには、xss()関数と、データを検証/サニタイズするための他の多数の関数があります。

于 2012-09-06T05:57:39.290 に答える