Javascript Secure Node.js聊天(避免XSS)

Javascript Secure Node.js聊天(避免XSS),javascript,node.js,security,socket.io,xss,Javascript,Node.js,Security,Socket.io,Xss,我正在用Node.js和socket.io构建一个简单的小聊天 当用户键入其消息时,该消息将广播给所有其他用户 服务器发送消息: io.sockets.emit('fromServerToClient', { "message": message }); 客户端显示它: socket.on('fromServerToClient', function (data) { $('#messages').append(data.message + '<br />'); });

我正在用Node.js和socket.io构建一个简单的小聊天

当用户键入其消息时,该消息将广播给所有其他用户

服务器发送消息:

io.sockets.emit('fromServerToClient', { "message": message });
客户端显示它:

socket.on('fromServerToClient', function (data) {
    $('#messages').append(data.message + '<br />');
});
socket.on('fromServerToClient',函数(数据){
$(“#消息”).append(data.message+”
); });
但是当您发送类似于
警报(1)的内容时,它在每个客户端浏览器上执行

这是一个严重的安全漏洞,我希望尽可能避免它。 我见过有人逃离
&,“
角色,但我认为这还不够

我如何才能100%确定聊天室中没有XSS漏洞

顺便说一下,我总是指定字符集以避免UTF-7攻击

谢谢你的帮助。

不要使用
.html()
,因为这基本上是
eval
类固醇-能够解释多种语言

文本始终被解释为文本,但:

$('#messages').append($("<div>", {
    text: data.message
}));
$('#消息')。附加($(“”{
文本:data.message
}));

最好的方法是让服务器什么都不做

是的,你读对了。正确的“转义”内容的位置是输出内容的位置,在输出内容的上下文中。这就是所谓的“过滤入,转义出”

因此,在您的情况下,客户端应该为您处理转义。有趣的是,jQuery(它看起来像您正在使用)有一个方法可以为您执行此操作:
$.fn.text()
。因此,您的客户端代码变成:

socket.on('fromServerToClient', function (data) {
    $('#messages').append($('<div></div>').text(data.message));
});
socket.on('fromServerToClient',函数(数据){
$('#messages')。追加($('').text(data.message));
});
我添加了
div
,这样每个消息都可以适当地设置样式

但是您的服务器端应该与此转义无关


现在,您可以决定过滤掉服务器上任何看起来像HTML的内容,这就是所谓的过滤(或者替换掉它,或者拒绝它)。但是绝对不要逃避它!

非常感谢这个非常好的答案。我不认为它会这么简单,我可以说它工作得很好。谢谢,这也很有帮助;)小心:“客户应该为您处理转义”并不总是一个好主意。例如,假设您的客户在发送消息之前转义了消息(说话的人就是转义文本的人)。这将是一个安全问题,因为客户端可以操纵转义代码而不转义任何内容。因此,在选择正确的客户端时要小心!@TheBronx:这始终是一个好主意,而且在大多数情况下是实现实际安全性的唯一方法。请注意,“客户端”指的是实际显示它的任何内容(将其注入HTML)。如果您的服务器呈现HTML,则服务器将进行转义。至于在发送HTML之前进行转义,这从一开始就是错误的,这就是为什么这是不安全的。过滤入,转义出是非常明确的定义,并且是众所周知的工作方式。如果您偏离了这一点,则由您来完成…客户端必须在输出数据之前进行转义。而不是在se之前结束它…@ircmaxell我知道你想说什么,我认为这是正确的。但这可能会让新手感到困惑,因为在聊天中,写和读的人都是应用程序的“客户”。我只是想澄清一下,对不起。