我正在使用Node.js和Underscore.js。我无法确定是否在服务器端或客户端转义JSON数据。对于下划线,不会使用语法<%= someValue %>
自动转义内插值,但使用<%- someValue %>
,这与EJS形成对比,可能会导致混淆。 GitHub上有issue,自动转义版本也有commit。但该问题下的评论说:
我的一般理念是逃避应该接近 你的数据而不是模板语言
那么,是否有任何关于何时将HTML转义为AJAX数据的建议更好?这是我一直使用的服务器端辅助函数:
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));
答案 0 :(得分:1)
在服务器上执行清理/转义操作总是更好,因为任何人都可以弄乱客户端代码并以他们想要的任何方式发送数据。
有一个很棒的node.js模块node-validator,它有一个xss()函数以及一堆其他函数来验证/清理你的数据。