安全的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掉或拒绝)。 但绝对不要逃避它!