gpt4 book ai didi

php - 我的 websocket 的服务器来源检查安全吗?

转载 作者:可可西里 更新时间:2023-11-01 13:28:26 25 4
gpt4 key购买 nike

我正在使用 https://github.com/lemmingzshadow/php-websocket/

我可以允许一些域,我已经允许 localhost 和一个指向我的本地服务器的域。但是我想知道在他的计算机上有服务器的其他人是否可以使用他的本地主机服务器中的脚本连接到我的 websocket(通过我的域)。

相关代码如下:

-> 服务器/服务器.php

$server->setAllowedOrigin('localhost');
$server->setAllowedOrigin('mydomain.com');

-> 服务器/lib/WebSocket/Connection.php

// check origin:
if($this->server->getCheckOrigin() === true)
{
$origin = (isset($headers['Sec-WebSocket-Origin'])) ? $headers['Sec-WebSocket-Origin'] : false;
$origin = (isset($headers['Origin'])) ? $headers['Origin'] : $origin;
if($origin === false)
{
$this->log('No origin provided.');
$this->sendHttpResponse(401);
stream_socket_shutdown($this->socket, STREAM_SHUT_RDWR);
$this->server->removeClientOnError($this);
return false;
}

if(empty($origin))
{
$this->log('Empty origin provided.');
$this->sendHttpResponse(401);
stream_socket_shutdown($this->socket, STREAM_SHUT_RDWR);
$this->server->removeClientOnError($this);
return false;
}

if($this->server->checkOrigin($origin) === false)
{
$this->log('Invalid origin provided.');
$this->sendHttpResponse(401);
stream_socket_shutdown($this->socket, STREAM_SHUT_RDWR);
$this->server->removeClientOnError($this);
return false;
}
}

-> 服务器/lib/WebSocket/Server.php

public function checkOrigin($domain)
{
$domain = str_replace('http://', '', $domain);
$domain = str_replace('https://', '', $domain);
$domain = str_replace('www.', '', $domain);
$domain = str_replace('/', '', $domain);

return isset($this->_allowedOrigins[$domain]);
}

public function setAllowedOrigin($domain)
{
$domain = str_replace('http://', '', $domain);
$domain = str_replace('www.', '', $domain);
$domain = (strpos($domain, '/') !== false) ? substr($domain, 0, strpos($domain, '/')) : $domain;
if(empty($domain))
{
return false;
}
$this->_allowedOrigins[$domain] = true;
return true;
}

编辑:

可能是我说的不够清楚。我希望每个人都可以连接到 websocket,但前提是他们在我的域(或我的本地主机)中,类似于 AJAX 中的同源策略。

我担心的是,如果我允许本地主机,也许其他计算机中的所有其他本地主机也将被允许。

最佳答案

如果你想确定,你应该添加一个 IP 检查,分析 $_SERVER["REMOTE_ADDR"]。正在检查的来源是客户端提供的文本值,很容易被伪造。

if (!in_array($_SERVER["REMOTE_ADDR"], array("127.0.0.1", "ip.of.dom.ain")) exit;

如果您不想硬编码 IP 地址或者 IP 地址经常更改,您可以使用 gethostbyname像这样获取域的 IP 地址。请注意,当必须为域查询 DNS 时,这会增加每个请求的延迟,并且当您的 DNS 出现故障时,这种方式会导致超时。 (当然可以优化下面的代码)

$allowed_origins = array('localhost', 'mydomain.com');
$allowed_ips = array();
foreach ($allowed_origins as $domain) {
$server->setAllowedOrigin($domain);
$allowed_ips[] = gethostbyname($domain);
}
if (!in_array($_SERVER["REMOTE_ADDR"], $allowed_ips)) exit;

执行此操作的正确方法可能是通过您的 Web 服务器保护您的资源,以便它只接受来自您希望允许的 IP 地址的请求(请参阅 deny in Apachedeny in nginx)。

关于php - 我的 websocket 的服务器来源检查安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14058330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com