我的websocket的服务器源是否安全检查?

Ori*_*iol 6 php security websocket

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

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

这是相关代码:

- > server/server.php

$server->setAllowedOrigin('localhost');
$server->setAllowedOrigin('mydomain.com');
Run Code Online (Sandbox Code Playgroud)

- > server/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;
    }
}
Run Code Online (Sandbox Code Playgroud)

- > server/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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

也许我不够清楚.我希望每个人都可以连接到websocket,但前提是它们位于我的域(或我的localhost),例如AJAX中的Same Origin Policy.

我担心的是,如果我允许localhost,也许其他计算机中的所有其他localhost也将被允许.

Ori*_*iol 1

虽然当我只想允许我的本地主机时,我担心允许来自所有本地主机的连接,但我发现在另一个问题中,卡纳卡说:

需要澄清的是,在未受影响且行为良好的浏览器中运行的 Javascript 不会影响 Sec-WebSocket-Origin 的值,该值保存了加载页面的原始站点的值(允许您的服务器仅允许某些起始点)。但是,如果您在 Node.js 中运行 Javascript 作为 WebSocket 客户端,它可以将原始值设置为它想要的任何值。CORS 安全是为了浏览器用户的安全,而不是为了您的服务器。您需要其他机制来保护您的服务器。

那么,我的起源检查代码根本不安全;如果全部允许所有本地主机并不重要,因为如果有人有足够的知识使用他自己的本地主机连接到我的 websocket,他很可能可以修改 Origin 标头。