Puncte:0

Actualizați cookie-ul de solicitare pentru cererile Varnish ESI-include de la `beresp` inițial

drapel cn

Am o aplicație care se află în fața unui server Varnish. Părți ale paginii sunt redate folosind ESI includes.

Problema mea este că răspunsul în amonte include un cookie de sesiune criptat, care, printre altele, conține un token CSRF (fără stocare de sesiune pe server).

Pentru o solicitare inițială (fără cookie în cerere), cererile ESI nu vor include un cookie setat de primul răspuns de la serverul din amonte.

Am încercat să setez req.http.Cookie în vcl_deliver cârlig, deoarece este singurul loc din fluxul de cereri pe care l-am găsit unde ambele solicitat și res sunt accesibile R/W. Cu toate acestea, examinarea solicitărilor cu varnishlog dezvăluie că solicitările ESI nu sunt afectate și nu includ cookie-ul.

Am făcut tot posibilul să răsfoiesc documentația, dar nu am găsit nimic util.

Este posibil să obțin ceea ce îmi doresc, adică să actualizez solicitat astfel încât cererile ESI să includă cookie-ul returnat de răspunsul inițial în amonte?

Puncte:1
drapel in

Trebuie să facem o distincție clară între o cerere care conține a Cookie antet și un răspuns care conține a Set-Cookie antet.

Presupunând că un jeton CSRF a fost setat printr-un Set-Cookie antetul răspunsului părintelui, probabil că doriți să accesați acea valoare prin a Cookie antetul cererii din subcererea dvs. ESI.

Presupunând că antetul Cookie conține deja jetonul CSRF

The req_top.http.Cookie variabila are totuși acces la cookie-urile cererii părinte req_top nu este accesibil în vcl_backend_response unde sunt analizați substituenții ESI.

Puteți ocoli această limitare cu următorul fragment VCL:

sub vcl_recv {
    if (req.esi_level > 0 ) {
        set req.http.X-Parent-Cookie = req_top.http.Cookie;
    }
}

Acest lucru va permite X-Parent-Cookie antet care este disponibil în vcl_backend_response prin bereq.http.X-Parent-Cookie.

Presupunând că antetul Cookie nu conține încă jetonul CSRF

Este realist să presupunem că req_top.http.Cookie nu conține încă valoarea jetonului CSRF, deoarece atunci când sunt procesate subcereri ESI, Cookie antetul nu este încă setat de client.

Singura soluție pe care o pot gândi este stocarea părintelui Set-Cookie valoare într-o variabilă. Variabilele nu sunt acceptate nativ în Varnish și necesită oficial https://github.com/varnish/varnish-modules a fi instalat.

Va trebui să compilați acest lucru din sursă.

Vedea https://github.com/varnish/varnish-modules/blob/master/src/vmod_var.vcc pentru vmod_var API și exemple de cod.

drapel cn
MULȚUMESC! Am uitat complet de `req_top`.
drapel cn
Pentru a detalia puțin, modific `req` în `vcl_deliver`, setând `req.http.X-Updated-Cookie` când `req.do_esi == true`. Apoi, în `vcl_recv`, când `req.esi_level > 0`, dacă `req_top.http.X-Update-Cookie` este setat, îl copiez în `req.http.Cookie`. Funcționează un răsfăț. Din fericire, nu sunt necesare vars-uri globale.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.