关于cdn 转发之后获取客户端真实ip 问题

tufei

我是群里的jocke

通过CDN(nginx) 转发到workerman chat 获取的ip 都是 CDN 的ip,想获取真是的用户ip ,想改造的话,该从哪个地方入手,尝试着修改了 Workerman\Protocols\Websocket.php 增加了 parseHttpHeader 方法里面对 $buffer的解析,但在events中却提示未定义;

奥总给的回答是
js获取到了,然后websocket自己发给wm

方法不错,不过,这样的话,IP,就可以伪造了

=================以下是Websocket.php接到的header的$buffer================

GET / HTTP/1.1
Host: ws.xxxx.com
X-Real-IP: 116.235.214.218
X-Forwarded-For: 116.235.214.218
Connection: close
Pragma: no-cache
Cache-Control: no-cache
Origin: http@//192.168.0.196
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Sec-WebSocket-Key: wY4G04lTDKqW8nQkOV50dA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

注:Origin: http@//192.168.0.196 @换成: 我的权限不让发站外链接

==========================events内获取到的$_SERVER============================

array(5) {
  =>
  string(10) "59.56.79.2"
  =>
  int(8293)
  =>
  string(9) "127.0.0.1"
  =>
  int(80)
  =>
  string(20) "7f00000108fd00000001"
}

因为cdn 层是服务商那边提供,没办法再做其他调整,所以想从wm 中入手,events内想获取到连接带过来的真实ip

7911 5 0
5个回答

walkor 打赏

先到官网重新下载一份代码,新版本支持了 onWebSocketConnect时设置session的特性。
然后在start_gateway.php中增加以下代码

$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        $_SESSION = $_SERVER;
    };
};

然后就可以在Events.php中直接通过$_SESSION得到客户端实际ip了

  • 暂无评论
tufei

哪个版本开始支持的?我昨天git 下载的。3.3.4版本

  • 暂无评论
walkor 打赏

一个小时前给你加的特性

  • 暂无评论
tufei

万分感谢!

  • 暂无评论
walkor 打赏

不客气

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