簡體   English   中英

我如何保護Socket.IO?

[英]How do I secure Socket.IO?

我已經和Socket.IO一起工作了幾天,這既令人興奮又令人沮喪。 缺乏當前的文檔/教程使學習變得非常困難。 我終於設法創建了一個基本的聊天系統,但有一個明顯的問題。 我該如何保護它?

是什么阻止惡意用戶復制(或編輯)我的代碼並連接到我的服務器? 我可以從我的PHP腳本中獲取用戶名並將其提交給Socket.IO,這樣我就可以將它們識別為該用戶(當然PHP具有安全性),但是什么阻止某人提交未注冊的用戶名?

如何確保提交的事件是真實的並且沒有被篡改?

我的基本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>

除了完全沒有安全性外,這一切都很有用。

如果您可以在節點服務器上安裝Redis等鍵值存儲,則可以使用像Predis這樣的Redis客戶端從php服務器遠程訪問它。 您需要做的就是在php服務器中發生新的登錄/注銷時更新節點服務器上的遠程會話存儲。

查看此帖子了解詳細信息: 為socket.io/nodejs驗證用戶身份

優秀的快遞護照框架使用安全的cookie來驗證身份。 甚至還有一個模塊可以從socket.io訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM