新手请教一个关于聊天室开发的安全问题

agressor

个人比较菜还望多多指教。目前我们开发了一套微信的应用程序,由于原有程序是放到windows2012的服务器上,所以考虑就把workerman放到了另一台linux服务器上。有几个疑问望大神们帮忙下。例如我使用WebSocket协议对外提供服务,在原有程序上开发的聊天室远程连接workerman的服务器,在微信应用的程序我会判定是否是这个聊天室的成员,包括是否为管理还是普通用户,我在想一个问题,就是微信应用的服务器发送到聊天服务器上是用json进行数据传输的,如果进行全体禁言时候微信应用的服务器会判断是否为管理是否为当前房间的用户,如果按照简单的开发实例在谷歌浏览器里输入:

// 假设服务端ip为127.0.0.1
ws = new WebSocket("ws://127.0.0.1:2346");
ws.onopen = function() {
    alert("连接成功");
    ws.send('tom');
    alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
    alert("收到服务端的消息:" + e.data);
};

有用户使用恶意行为进行json数据进行更改的话,那么装有workerman的服务器应该如何判断恶意更改的用户是否为管理是否是这个聊天室的成员?
还有就是如果用户知道json数据格式后,这些随意更改房间号接收其他房间的信息或者进行其他踢人的功能,如何避免恶意使用?
我的想法是用户发送信息到workerman服务器后,在微信应用的服务器接收数据时候进行判断是否有相关的权限但是感觉还是有些行不通。还望大神不吝赐教。

6471 8 0
8个回答

walkor

建议用GatewayWorker框架,业务实现不在GatewayWorker中做,仅仅把GatewayWorker当作一个单向的推送通道(通过GatewayClient向客户端推送)。这样GatewayWorker与现有项目能很好的解耦,权限控制及其它业务逻辑还是按照项目原有的方法做,仅当需要向客户端主动推送数据时才调用GatewayClient推送数据。

参考这个 http://wenda.workerman.net/?/question/886

  • 暂无评论
agressor

多谢大神 ! 看了你发的这个链接如大梦初醒一般。太方便了!多谢!!!
刚接触了两天看完了workerman GatewayWorker框架还没看。

  • 暂无评论
agressor

大神再请教一个问题 如果把GatewayWorker当做一个单向的推送通道,那如何实现语音实时传输呢?

  • 暂无评论
walkor

客户端需要什么格式直接传就行了

  • 暂无评论
agressor

大神求指教,GatewayClient和GatewayWorker不是在同一台服务器上,GatewayClient接收数据怎么写?
能否给个例子?

  • 暂无评论
walkor

GatewayClient只能发,不能收。单向的

  • 暂无评论
agressor

大神求指教,我把GatewayWorker当做一个单向的推送通道,在客户端连接上之后在服务器上的Event.php 写的直接获取客户端的client_id

 public static function onConnect($client_id)
 {
     // 向当前client_id发送数据
     $data = array(
         'type' => 'login', 
        'client_id'=>$client_id
     ); 
     Gateway::sendToClient($client_id,json_encode($data));
 }

然后发送给客户端,客户端接收到信息后发送到应用后端GatewayClient 进行分组 绑定UID 发送登录信息。
由于所建立的是单向的推送通道 服务器上的event.php只写了用户连接上之后发送的业务逻辑其他的业务逻辑都是在另一个应用上写的。但是又碰到难点了,

Gateway::getClientInfoByGroup($roomid);
foreach($clients_list as $tmp_client_id=>$item)
{
    $clients_list = $item;
}

获得json
Object {781ade1d0b560000001a: null, 781ade1d0b5700000012: null}
client_id对应的clientname都是为null,如果在服务器上可以session用户名,这作为单项通道如何session存储用户名呢?迷茫了求助

  • 暂无评论
walkor

GatewayClient有个Gateway:: updateSession($client_id, $session); 方法,可以后台更改某个client_id的session

  • 暂无评论
年代过于久远,无法发表回答
🔝