PHP WebSocket Server не может получить доступ к заголовкам Origin и Referrer. - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть простой сервер веб-сокета PHP

Вот полный код: https://gist.github.com/hack4mer/e40094001d16c75fe5ae8347ebffccb7

while (true) {

$changed = $clients;
socket_select($changed, $null, $null, 0, 10);

//check for new socket
if (in_array($socket, $changed)) {
    $socket_new = socket_accept($socket); //accpet new socket
    $clients[] = $socket_new; //add socket to client array

   //THIS DOES NOT WORK
   print_r($_SERVER);
   die();

}

На вкладке сети браузера я могу подтвердить следующий запрос:

Request URL: ws://localhost:12345/
Provisional headers are shown
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,hi;q=0.8,ms;q=0.7
Cache-Control: no-cache
Connection: Upgrade
Host: localhost:12345
Origin: http://localhost

Однако я не могу получить доступ к этим заголовкам запросов в моем сценарии.

Моя цель - ограничить доступ к WebSocket только для нескольких хостов

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Я решил эту проблему, выполнив проверку заголовка перед подтверждением связи.

Полный код: https://gist.github.com/hack4mer/e40094001d16c75fe5ae8347ebffccb7

function perform_handshaking($receved_header,$client_conn, $host, $port)
{
$headers = array();
$lines = preg_split("/\r\n/", $receved_header);
foreach($lines as $line)
{
    $line = chop($line);
    if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
    {
        $headers[$matches[1]] = $matches[2];
    }
}

 //HEADERS AVAILABLE HERE -> $headers

$secKey = $headers['Sec-WebSocket-Key'];
$secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
//hand shaking header
$upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"WebSocket-Origin: $host\r\n" .
"WebSocket-Location: ws://$host:$port/demo/shout.php\r\n".
"Sec-WebSocket-Accept:$secAccept\r\n\r\n";
socket_write($client_conn,$upgrade,strlen($upgrade));
}
0 голосов
/ 18 сентября 2018

Вам придется буферизовать данные, по крайней мере, до тех пор, пока не будут созданы заголовки (CRLF).

Посмотрите на реагировать / сокет .С этим очень легко использовать неблокирующие сокеты.

Чтобы реализовать протокол websocket, взгляните на ratchetphp / RFC6455 .

...