安全的Node.js聊天(避免XSS)

我正在与Node.js和socket.iobuild立一个简单的小聊天

当用户键入他的消息时,它被广播给所有其他用户。

服务器发送消息:

io.sockets.emit('fromServerToClient', { "message": message }); 

客户端显示它:

 socket.on('fromServerToClient', function (data) { $('#messages').append(data.message + '<br />'); }); 

但是当你发送像<script>alert(1);</script> ,它会在每个客户端浏览器上执行。

这是一个严重的安全缺陷,我想尽可能避免它。 我看到有人逃跑,但是我不认为这是足够的!

我怎么能100%确定我的聊天没有XSS漏洞?

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

谢谢你的帮助。

不要使用.html()因为这基本上是类固醇的eval – 能够导致各种各样的语言的解释。

文本总是被解释为文本:

 $('#messages').append($("<div>", { text: data.message })); 

这里最好的办法是让服务器不做任何事情!

是的,你没有看错。 “逃避”内容的正确位置就是输出内容的地方。 这就是所谓的过滤,退出。

所以在你的情况下,客户端应该为你处理逃跑。 有趣的是,jQuery(它看起来像你正在使用)有一个方法,为你做这个: $.fn.text() 。 所以你的客户代码变成:

 socket.on('fromServerToClient', function (data) { $('#messages').append($('<div></div>').text(data.message)); }); 

我添加了div以便每个消息都可以适当地设置…

但是你的服务器端应该和这个转义无关。

现在,你可以决定在服务器上过滤掉任何看起来像HTML的东西,这就是所谓的过滤(也可以将其replace掉或拒绝)。 但绝对不要逃避它!