Socket.io中的新增功能,如何防止Socket.io客户端脚本入侵

Ron*_*nho 4 javascript security node.js socket.io

我是Socket.IO的新手,我刚刚在http://socket.io/get-started/chat/上实现了有关Socket.IO的教程说明.这很有趣.

但现在我对安全感到担忧.发送消息的客户端代码是:

<script>
  var socket = io();
  $('form').submit(function(){
    socket.emit('chat message', $('#m').val());
    $('#m').val('');
    return false;
  });
  socket.on('chat message', function(msg){
    $('#messages').append($('<li>').text(msg));
  });
</script>
Run Code Online (Sandbox Code Playgroud)

函数调用socket.emit将向服务器发送消息,通过此流程,访问Web的任何人都可以轻松修改Javascript代码(使用Chrome devtools或Firebug)向服务器发送任何消息.

例如,用户可以按如下方式添加代码行:

<script>
   $(document).load(function() {
       socket.emit('chat message', '1122');
       socket.emit('get_users', null);
       socket.emit('delete_user', 1);        // What ever he wants
   });
</script>
Run Code Online (Sandbox Code Playgroud)

这种黑客可能会对系统造成危害.

我的问题是,如何防止用户修改Javascript代码并手动调用socket.io服务器,包括有权登录Web应用程序的用户.

任何帮助将非常感谢!

jfr*_*d00 10

我的问题是,如何防止用户修改Javascript代码并手动调用socket.io服务器,包括有权登录Web应用程序的用户.

您无法阻止用户修改您的Javascript代码. 它可以从浏览器中复制,修改然后再次运行.你不能阻止这一点.您必须在不依赖任何代码保护的情况下保护事物.相反,您必须保护代码可以执行的操作,因此恶意代码不会对除了自身之外的任何用户造成任何伤害.

客户永远不可信任.服务器必须始终进行身份验证和验证,并且不会暴露有害命令.

您应该验证或检查服务器上的每条消息,看看它是否合理,就像您应该验证所有表单内容或提交给服务器的Ajax调用一样.

Ÿ 欧不应该让任何命令,有害于你的服务器浏览器. 例如,一个用户不应该从常规客户端页面删除另一个用户 - 永远.基本上普通用户应该只能修改自己的东西.

您也可以为您的服务实施适用于您的webSocket连接的身份验证方案. 这将允许您禁止任何人从您的服务中造成伤害或似乎试图造成伤害.

您可以实现各种速率限制方案,这些方案限制任何给定用户可以对您的服务器执行的操作,以保护服务器的完整性和负载.

您可以通过在流程中需要像验证码或类似验证码的步骤来阻止各种类型的自动化操作(需要实际用户的东西).


另外,请记住,根据定义,socket.io客户端可以执行的任务是向服务器发送消息.您的工作不是暴露任何有害消息,并验证可能需要该类型验证或可能被滥用的任何命令的真实性或来源.例如,绝对没有理由公开命令delete_user x.您可以为用户公开命令以自行删除,但这几乎是删除它.普通用户永远不能删除其他用户.


仅供参考,所有这些相同的问题都适用于Ajax调用和表单POST.它们是完全相同的问题,并不是webSocket独有的,因为它们都涉及不受信任的客户端发送服务器,无论他们想发送什么.假设您无法控制客户端可能尝试的操作,您必须使服务器安全无虞.