web-dev-qa-db-fra.com

Comment sécuriser Socket.IO?

Je travaille avec Socket.IO depuis quelques jours et c'est à la fois extrêmement excitant et encore plus frustrant. Le manque de documentation/tutoriels actuels a rendu l'apprentissage très difficile. J'ai finalement réussi à créer un système de chat de base, mais il y a une question flagrante. Comment le sécuriser?

Qu'est-ce qui empêche un utilisateur malveillant de copier (ou de modifier) ​​mon code et de se connecter à mon serveur? Je peux récupérer le nom d'utilisateur de mon script PHP et le soumettre à Socket.IO afin que je puisse le reconnaître comme cet utilisateur (et le PHP a bien sûr la sécurité) ), mais qu'est-ce qui empêche quelqu'un de simplement soumettre un nom d'utilisateur non enregistré?

Comment puis-je m'assurer que les événements soumis sont authentiques et n'ont pas été falsifiés?

Mon chat de base socket.io pour les références.

Serveur:

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--; });
});

Client:

    <?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>

Tout fonctionne dandy, sauf qu'il n'a absolument aucune sécurité.

31
Ian

Si vous pouvez installer un magasin de valeurs-clés comme Redis sur votre serveur de noeud, vous pouvez y accéder à distance depuis votre serveur php en utilisant un client Redis comme Predis . Tout ce que vous avez à faire est de mettre à jour le magasin de session distant sur le serveur de noeud lorsqu'une nouvelle connexion/déconnexion se produit sur votre serveur php.

Consultez cet article pour plus de détails: Authentifiez l'utilisateur pour socket.io/nodejs

8
Snow Blind

L'excellent cadre de passeport pour les utilisations express utilise des cookies sécurisés pour valider l'identité. Il y a même un module pour y accéder depuis socket.io.

3
kjv