Node.js と Underscore.js を使用しています。サーバー側とクライアント側のどちらで JSON データをエスケープするかを判断できません。アンダースコアは、構文では補間された値を自動エスケープしません<%= someValue %>
が<%- someValue %>
、EJS とは対照的であり、混乱を引き起こす可能性があります。GitHub に問題があり、自動エスケープ バージョンのコミットもありました。しかし、問題の下のコメントは次のように述べています。
私は、エスケープはテンプレート言語よりもデータの近くで行うべきであるという一般的な哲学を持っています
では、AJAX データへの HTML エスケープをいつ行うのがよいかという提案はありますか? 私が使用しているサーバー側のヘルパー関数は次のとおりです。
var htmlEscape = function(html){
return String(html)
.replace(/&(?!\w+;)/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"');
};
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));