我已经和Socket.IO合作了几天而且非常令人兴奋,甚至更令人沮丧。缺乏当前的文档/教程使学习变得非常困难。我终于设法创建了一个基本的聊天系统,但有一个明显的问题。我该如何保护它?
什么阻止恶意用户复制(或编辑)我的代码并连接到我的服务器?我可以从我的PHP脚本中获取用户名并将其提交给Socket.IO,这样我就可以将它们识别为该用户(当然PHP具有安全性),但是什么阻止某人提交未注册的用户名? / p>
如何确保提交的事件是真实的并且未被篡改?
我的基本socket.io聊天参考。
服务器:
var io = require('socket.io').listen(8080);
var connectCounter = 0;
io.sockets.on('connection', function (socket) {
connectCounter++;
console.log('People online: ', connectCounter);
socket.on('set username', function(username) {
socket.set('username', username, function() {
console.log('Connect', username);
});
});
socket.on('emit_msg', function (msg) {
// Get the variable 'username'
socket.get('username', function (err, username) {
console.log('Chat message by', username);
io.sockets.volatile.emit( 'broadcast_msg' , username + ': ' + msg );
});
});
socket.on('disconnect', function() { connectCounter--; });
});
客户端:
<?php session_start() ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>untitled</title>
</head>
<body>
<input id='message' type='text'>
<div id="content"></div>
<script src="http://localhost:8080/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
var socket = io.connect('http://localhost:8080');
$.ajax({
type: 'GET',
url: 'https://mysite.com/execs/login.php?login_check=true',
dataType: 'json',
success: function(data) {
var username = data.username;
socket.emit('set username', username, function (data){
});
}
});
socket.on('broadcast_msg', function (data) {
console.log('Get broadcasted msg:', data);
var msg = '<li>' + data + '</li>';
$('#content').append(msg);
});
$('#message').keydown(function(e) {
if(e.keyCode == 13) {
e.stopPropagation();
var txt = $(this).val();
$(this).val('');
socket.emit('emit_msg', txt, function (data){
console.log('Emit Broadcast msg', data);
});
}
});
</script>
</body>
</html>
除了完全没有安全保障外,这一切都很有用。
答案 0 :(得分:8)
如果您可以在节点服务器上安装像Redis这样的键值存储,则可以使用Redis客户端(如Predis)从您的php服务器远程访问它。您需要做的就是在php服务器上发生新的登录/注销时更新节点服务器上的远程会话存储。
查看此帖子了解详情:Authenticate user for socket.io/nodejs
答案 1 :(得分:2)
优秀的快递护照框架使用安全cookie来验证身份。甚至还有一个module可以从socket.io中访问它。