เราจำเป็นต้องแยกให้ชัดเจนระหว่างคำขอที่มี คุกกี้ ส่วนหัวและการตอบกลับที่มี ชุดคุกกี้ หัวข้อ.
สมมติว่าโทเค็น CSRF ถูกตั้งค่าผ่าน ชุดคุกกี้ ส่วนหัวของการตอบกลับพาเรนต์ คุณอาจต้องการเข้าถึงค่านั้นผ่าน คุกกี้ ส่วนหัวของคำขอในคำขอย่อย ESI ของคุณ
สมมติว่าส่วนหัวของคุกกี้มีโทเค็น CSRF อยู่แล้ว
เดอะ req_top.http.คุกกี้ อย่างไรก็ตามตัวแปรสามารถเข้าถึงคุกกี้ของคำขอหลักได้ req_top ไม่สามารถเข้าถึงได้ใน vcl_backend_response โดยที่ตัวยึดตำแหน่ง ESI จะถูกแยกวิเคราะห์
คุณสามารถข้ามข้อจำกัดนี้ได้ด้วยข้อมูลโค้ด VCL ต่อไปนี้:
ย่อย vcl_recv {
ถ้า (req.esi_level > 0 ) {
ตั้ง req.http.X-Parent-Cookie = req_top.http.Cookie;
}
}
สิ่งนี้จะเปิดใช้งาน X-Parent-คุกกี้ ส่วนหัวที่มีอยู่ใน vcl_backend_response ผ่าน bereq.http.X-Parent-Cookie.
สมมติว่าส่วนหัวของคุกกี้ยังไม่มีโทเค็น CSRF
มันเป็นเรื่องจริงที่จะสันนิษฐานว่า req_top.http.คุกกี้ ยังไม่มีค่าของโทเค็น CSRF เนื่องจากเมื่อคำขอย่อย ESI ได้รับการประมวลผล คุกกี้ ลูกค้ายังไม่ได้กำหนดส่วนหัว
ทางออกเดียวที่ฉันคิดออกคือการจัดเก็บพาเรนต์ ชุดคุกกี้ ค่าในตัวแปร ตัวแปรไม่ได้รับการสนับสนุนโดยกำเนิดในวานิชและต้องใช้อย่างเป็นทางการ https://github.com/varnish/varnish-modules ที่จะติดตั้ง
คุณจะต้องรวบรวมสิ่งนี้จากแหล่งที่มา
ดู https://github.com/varnish/varnish-modules/blob/master/src/vmod_var.vcc สำหรับ vmod_var ตัวอย่าง API และโค้ด