Не удается получить все заголовки запросов с помощью тонкой структуры PHP

Я использую тонкий фреймворк PHP для личного проекта. По какой-то причине реализация запроса PSR в Slim, по-видимому, фильтрует некоторые заголовки. Я пытаюсь установить собственный токен CSRF, но он недоступен через $request->getHeaders(). Вот один пример, показывающий проблему:

$app->get('/bar', function ($request, $response, $args) {
    echo "PHP's getallheaders() <br>";
    foreach (getallheaders() as $name => $value) {
        echo "$name: $value <br>";
    }
    echo "Slim's GetHeaders() <br>";
    foreach ($request->getHeaders() as $name => $values) {
        foreach ($values as $value) {
            echo "$name: $value <br>";
        }
    }
});

Я получаю этот вывод:

PHP's getallheaders()
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: null
Accept-Encoding: gzip, deflate
csrf_name: csrf56fc038c2f6eb
csrf_value: 4e077c04dadf22377da2aebc1a8caa78
Cookie: PHPSESSID=41016nbag70gi6shq4u2tg0aq1
Connection: keep-alive

Slim's GetHeaders()
Host: localhost
HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_LANGUAGE: null
HTTP_ACCEPT_ENCODING: gzip, deflate
HTTP_COOKIE: PHPSESSID=41016nbag70gi6shq4u2tg0aq1
HTTP_CONNECTION: keep-alive 

Я пытаюсь понять, почему пользовательские заголовки:

csrf_name: csrf56fc038c2f6eb
csrf_value: 4e077c04dadf22377da2aebc1a8caa78 

удаляются Слимом.


person Jose Cifuentes    schedule 30.03.2016    source источник


Ответы (2)


Это не Slim, это веб-сервер.

Несмотря на то, что заголовок, имя которого содержит подчеркивание, допустим по спецификации HTTP, оба Nginx и Apache автоматически удаляют эти заголовки из соображений безопасности. Как правило, вы должны использовать только заголовки use, содержащие символы a..zA..Z и -.

С Apache вы все еще можете получить доступ к заголовку с подчеркиванием в их имени, используя getallheaders(), который является псевдонимом для apache_request_headers().

С помощью Nginx вы можете включить заголовки с символом подчеркивания в имени с настройкой underscores_in_headers on.

person Mika Tuupola    schedule 31.03.2016
comment
Спасибо! Полезно знать эти подробности о HTTP-серверах. Я нашел методом проб и ошибок, поэтому моей первой реакцией было подумать, что виноват Слим. - person Jose Cifuentes; 31.03.2016

Хотите верьте, хотите нет, но проблема заключалась в том, что Слиму не нравилось подчеркивание в определяемом пользователем заголовке. Как только я изменил csrf_name на csrfname, все заработало:

PHP's getallheaders()
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: null
Accept-Encoding: gzip, deflate
csrfvalue: 4e077c04dadf22377da2aebc1a8caa78
csrfname: csrf56fc038c2f6eb
Cookie: PHPSESSID=5aom8b5q7ottorc9279q9sh4g1
Connection: keep-alive

Slim's GetHeaders()
Host: localhost
HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_LANGUAGE: null
HTTP_ACCEPT_ENCODING: gzip, deflate
HTTP_CSRFVALUE: 4e077c04dadf22377da2aebc1a8caa78
HTTP_CSRFNAME: csrf56fc038c2f6eb
HTTP_COOKIE: PHPSESSID=5aom8b5q7ottorc9279q9sh4g1
HTTP_CONNECTION: keep-alive

Итак, не забудьте убрать подчеркивания!!

EDIT Как объяснил Мика Туупола, основной причиной является HTTP-сервер, а не тонкий.

person Jose Cifuentes    schedule 30.03.2016