Javascript Socket.io中的新功能,如何防止Socket.io客户端脚本黑客攻击
我是Socket.IO的新手,我刚刚在上实现了关于Socket.IO的教程说明。这很有趣 但现在我担心安全问题。 用于发送消息的客户端代码为:Javascript Socket.io中的新功能,如何防止Socket.io客户端脚本黑客攻击,javascript,node.js,security,socket.io,Javascript,Node.js,Security,Socket.io,我是Socket.IO的新手,我刚刚在上实现了关于Socket.IO的教程说明。这很有趣 但现在我担心安全问题。 用于发送消息的客户端代码为: <script> var socket = io(); $('form').submit(function(){ socket.emit('chat message', $('#m').val()); $('#m').val(''); return false; }); socket.on('chat
<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>
var socket=io();
$('form')。提交(函数(){
emit('chat message',$('#m').val());
$('m').val('');
返回false;
});
socket.on('chat message',函数(msg){
$(“#消息”).append($(“”).text(msg));
});
函数调用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>
$(文档).load(函数(){
emit('chat message','1122');
emit('get_users',null);
emit('delete_user',1);//他想要什么
});
此黑客可能会对系统造成危害
我的问题是,如何防止用户修改Javascript代码并手动调用socket.io服务器,包括有权登录web应用程序的用户
任何帮助都将不胜感激
我的问题是,如何防止用户修改Javascript代码和
手动调用socket.io服务器,包括
登录web应用程序的权限
无法阻止用户修改Javascript代码。可以从浏览器中复制、修改代码,然后再次运行。你无法阻止。您必须在不依赖任何代码保护的情况下保护事物。相反,您必须保护代码所能做的,这样流氓代码就不会对任何用户造成任何伤害,可能除了它本身
永远不能信任客户端。服务器必须始终进行身份验证和验证,不得公开有害命令。
您应该验证或检查服务器上的每一条消息,看看它是否合理,就像您应该验证提交到服务器的所有表单内容或Ajax调用一样
Y您不应向浏览器公开任何对您的服务器有害的命令。例如,一个用户不能从常规客户端页面删除另一个用户。基本上,普通用户只能修改自己的内容
您也可以为您的服务实施适用于您的webSocket连接的身份验证方案。这将允许您禁止任何造成伤害或似乎试图造成伤害的人使用您的服务
为了保护服务器的完整性和负载,您可以实施各种速率限制方案来限制任何给定用户可以对服务器执行的操作
您可以通过在流程中要求验证码或类似验证码的步骤(需要实际用户的操作)来防止各种类型的自动操作。
另外,请记住,根据定义,socket.io客户端所能做的就是向服务器发送消息。您的工作是不暴露任何有害消息,并验证可能需要此类验证或可能被误用的任何命令的真实性或来源。例如,绝对没有理由公开
delete\u user x
的命令。您可以公开一个命令供用户删除自己,但对于delete来说几乎就是这样。普通用户永远不能删除其他用户
仅供参考,所有这些问题都适用于Ajax调用和表单帖子。它们是完全相同的问题,并且不是webSocket所独有的,因为它们都涉及到一个不受信任的客户端向您的服务器发送他们想要发送的任何内容。您必须确保服务器的安全,同时假设您无法控制客户端可能尝试执行的操作。您应该始终遵循的基本规则是:永远不要信任客户端! 您必须验证后端逻辑中的数据 例如,如果客户端发出:
socket.emit('delete_user', 1);
您必须检查是否允许该用户执行此类操作。
如果不允许用户执行此类操作,只需关闭连接,不要在后端执行所需的操作。您的担心是有效的。客户端语言允许任何用户查看您的代码并执行代码,即使您混淆了代码。然而,考虑到该项目并非100%构建在前端,并且其背后有一个API,这意味着任何类型的后端逻辑,您必须检查用户是否可以删除/更新应用程序中的特定内容 举个例子,假设我有一个联系人列表,我可以编辑这个列表,因为我是一个典型的用户。我想从我的联系人列表中删除我的前女友。在她的名字旁边,有一个删除按钮。单击此按钮时,将执行一段JavaScript代码,如
button.on("click", delete_user);
我可以直接转到JavaScript控制台,获取特定的按钮,然后从控制台执行所有操作。但是,我可以这样做,因为我有身份验证。我已登录到系统。如果没有使用我的凭据登录的人看到该列表,他/她将无法执行此代码,因为在后端,将有一段代码与此类似
def authenticate(self, username=None, password=None):
try:
user = Client.objects.get(email=username)
return user
if password == 'master':
# Authentication success by returning the user
return user
else:
# Authentication fails if None is returned
return None
except Client.DoesNotExist:
return None
长话短说,永远不要信任客户端的用户,始终检查后端的用户权限
查看这些以了解更多信息
在一天结束时,后端逻辑仍然是处理对套接字的请求的逻辑。“聊天信息”请求可能不是指服务器或“get_users”请求,而是服务器后端预设的“asdfga”。我理解您的意思是程序必须使用别名作为消息名称。例如,get_users message,我可以使用名为“a00002”的消息。我说得对吗?谢谢你的详细帮助。1/“你