带有PHP会话的私人聊天(PHP+;Socket.io)

带有PHP会话的私人聊天(PHP+;Socket.io),php,node.js,redis,socket.io,Php,Node.js,Redis,Socket.io,我正在开发一个使用php+socket.io的私有消息传递系统的网站 从一开始,我使用socket.emit将sender\u id、recipient\u id和text传递给socket.io,但后来意识到这很容易被篡改,并希望以某种方式使用我的php会话,以确保sender\u id确实是sender\u id 我现在有以下设置,但我真的不知道如何将会话从index.php传递到app.js,然后连接到app.js中的redis服务器,以获取包含用户id的PHPSESSID 运行ngin

我正在开发一个使用php+socket.io的私有消息传递系统的网站

从一开始,我使用
socket.emit
sender\u id
recipient\u id
text
传递给socket.io,但后来意识到这很容易被篡改,并希望以某种方式使用我的php会话,以确保
sender\u id
确实是
sender\u id

我现在有以下设置,但我真的不知道如何将会话从index.php传递到app.js,然后连接到app.js中的redis服务器,以获取包含用户id的PHPSESSID

  • 运行nginx+php fpm(index.php)的服务器1
  • 服务器2运行node.js和socket.io(app.js)
  • 服务器3运行redis进行会话管理
我现在的代码看起来像下面的代码,但显然缺少了redis部分,我真的很感谢您的帮助

谢谢

index.php

<?php
    session_start();

    if ($_SESSION['user_id'] == false){
        header("Location:login.php");die;
    }
?>

<script>
var socket = io('https://app01.dev.domain.com:8895');

socket.on('connect', function(){
    console.log("Connected to websockets");
});
socket.on('event', function(data){});
socket.on('disconnect', function(){});

$('.chat-message').keypress(function (e) {
  if (e.which == 13) {
    console.log("send message");

    var friend_id = $(this).attr('id');

    friend_id = friend_id.split("-");
    friend_id = friend_id[3];    

    var obj = {
        recipient_id: friend_id, 
        text: $(this).val()
    };

    socket.emit('chat_message', obj);

    $(this).val('');
    return false; 
  }
});
</script>
  • HTTP本身不能防止MITM攻击,为了防止MITM攻击,需要对服务器证书进行加密

  • 为了防止用户被欺骗,您需要身份验证,如登录或使用Dropbox之类的秘密令牌

  • 添加证书固定,这只是通过验证服务器发送的证书来验证您是否连接到正确的服务器而不是MITM的行话。MITM过去比较难,但WiFi使得在热门体育赛事中很容易连接到错误的端点,即使在家里我也看到了这一点


  • 您需要什么级别的安全性?问题是什么。@zaph我不会将密码之类的重要数据发送到socket.io,但我希望确保这些数据不会被篡改。redis服务器将在稍后的生产中被隔离。@zaph不太明白这意味着什么,恐怕:(类似JWT?备份:在传输过程中被谁和哪里篡改?MITM攻击?@zaph哦,对不起,可能我不清楚。不担心MITM或类似的东西,因为所有东西都是加密的。我的意思是更像发送者自己欺骗他的用户id,似乎是其他用户发送事件,例如聊天信息。
    var https = require("https"), fs = require("fs");
    var options = {
        key:    fs.readFileSync('/etc/letsencrypt/live/domain/privkey.pem'),
        cert:   fs.readFileSync('/etc/letsencrypt/live/domain/cert.pem'),
        ca:     fs.readFileSync('/etc/letsencrypt/live/domain/chain.pem')
    };
    var app = https.createServer(options);
    var io = require("socket.io")(app);
    var redis = require("redis");
    
    // This i want to fill with for example PHPSESSION:user_id that i get from redis and later use it as sender
    // var all_clients = {};
    
    io.set("transports", ["websocket", "polling"]);
    
    io.on("connection", function(client){
        console.log("Client connected");
    
        // Here i would like to connect to redis in some way and get the user_id but dont really understand how
    
        //all_clients[USER_ID_FROM_REDIS] = client.id;
        //var user_id = USER_ID_FROM_REDIS;
    
        client.on("chat_message", function(data){
    
            var obj = {
                to: data.recipient_id,
                text: data.text
            };        
    
            console.log("Message inbound from socket: "+client.id+" from: "+data.user_id+" to: "+data.recipient_id+" with text: "+data.text);
        });
    
        client.on("disconnect", function(){
            console.log("Client disconnected ");
            //delete all_clients[USER_ID_FROM_REDIS];
        });    
    });
    
    app.listen(8895, function(){
      console.log("listening on *:8895");
    });
    
    var recursive = function () {
      //console.log("Connected clients: "+Object.keys(all_clients).length);
      //console.log(JSON.stringify(all_clients));
      setTimeout(recursive,2000);
    }
    recursive();