Рейтинг:0

Файл cookie запроса обновления для запросов Varnish ESI-include из исходного `beresp`

флаг cn

У меня есть приложение, перед которым стоит сервер Varnish. Части страницы отображаются с использованием включений ESI.

Моя проблема заключается в том, что восходящий ответ включает зашифрованный файл cookie сеанса, который, помимо прочего, содержит токен CSRF (вообще нет хранилища сеансов на стороне сервера).

Для начального запроса (без файла cookie в запросе) запросы ESI не будут включать файл cookie, установленный первым ответом от вышестоящего сервера.

я пытался настроить req.http.Cookie в vcl_deliver ловушку, так как это единственное место в потоке запросов, которое я нашел, где оба запрос и разрешение доступны для чтения/записи. Однако просмотр запросов с помощью лаклога показывает, что запросы ESI не затрагиваются и не включают файл cookie.

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

Можно ли добиться того, чего я хочу, т.е. обновить запрос чтобы запросы ESI включали файл cookie, возвращаемый первоначальным восходящим ответом?

Рейтинг:1
флаг in

Нам необходимо провести четкое различие между запросом, содержащим Куки заголовок и ответ, содержащий Set-Cookie заголовок.

Предполагая, что токен CSRF был установлен через Set-Cookie заголовок родительского ответа, вы, вероятно, захотите получить доступ к этому значению через Куки заголовок запроса в подзапросе ESI.

Предполагая, что заголовок Cookie уже содержит токен CSRF

req_top.http.Cookie переменная имеет доступ к файлам cookie родительского запроса, однако req_top недоступно в vcl_backend_response где анализируются заполнители ESI.

Вы можете обойти это ограничение с помощью следующего фрагмента кода VCL:

суб vcl_recv {
    если (req.esi_level > 0) {
        установить req.http.X-Parent-Cookie = req_top.http.Cookie;
    }
}

Это позволит X-Parent-Cookie заголовок, который доступен в vcl_backend_response через bereq.http.X-Parent-Cookie.

Предполагая, что заголовок Cookie еще не содержит токен CSRF

Реально предположить, что req_top.http.Cookie еще не содержит значение токена CSRF, поскольку при обработке подзапросов ESI Куки заголовок еще не установлен клиентом.

Единственное решение, которое я могу придумать, это сохранить родительский Set-Cookie значение в переменной. Переменные изначально не поддерживаются в Varnish и требуют официального https://github.com/varnish/varnish-модули быть установленным.

Вам придется скомпилировать это из исходников.

Видеть https://github.com/varnish/varnish-modules/blob/master/src/vmod_var.vcc для vmod_var Примеры API и кода.

флаг cn
БЛАГОДАРЮ ВАС! Я совершенно забыл о `req_top`.
флаг cn
Чтобы немного уточнить, я исправляю `req` в `vcl_deliver`, устанавливая `req.http.X-Updated-Cookie`, когда `req.do_esi == true`. Затем в `vcl_recv`, когда `req.esi_level > 0`, если установлен `req_top.http.X-Update-Cookie`, я копирую его в `req.http.Cookie`. Работает удовольствие. К счастью, глобальные переменные не требуются.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.