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也将被允许.
虽然当我只想允许我的本地主机时,我担心允许来自所有本地主机的连接,但我发现在另一个问题中,卡纳卡说:
需要澄清的是,在未受影响且行为良好的浏览器中运行的 Javascript 不会影响 Sec-WebSocket-Origin 的值,该值保存了加载页面的原始站点的值(允许您的服务器仅允许某些起始点)。但是,如果您在 Node.js 中运行 Javascript 作为 WebSocket 客户端,它可以将原始值设置为它想要的任何值。CORS 安全是为了浏览器用户的安全,而不是为了您的服务器。您需要其他机制来保护您的服务器。
那么,我的起源检查代码根本不安全;如果全部允许所有本地主机并不重要,因为如果有人有足够的知识使用他自己的本地主机连接到我的 websocket,他很可能可以修改 Origin 标头。
| 归档时间: |
|
| 查看次数: |
1834 次 |
| 最近记录: |