4

我正在使用 Node.js 和 Underscore.js。我无法确定是在服务器端还是客户端转义 JSON 数据。For underscore 不会使用语法自动转义插值,<%= someValue %>而是使用 with <%- someValue %>,这与 EJS 形成对比,可能会导致混淆。GitHub上有一个问题,还有一个自动转义版本的提交。但该问题下方的评论说:

我的一般理念是转义应该更接近您的数据而不是模板语言

那么,有什么建议何时将 HTML 转义为 AJAX 数据更好?这是我一直在使用的服务器端助手功能:

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 回答