Score:0

อัปเดตคำขอคุกกี้สำหรับ Varnish ESI-รวมถึงคำขอจาก `beresp` เริ่มต้น

ธง cn

ฉันมีแอปพลิเคชันที่อยู่หน้าเซิร์ฟเวอร์วานิช ส่วนต่างๆ ของหน้าแสดงผลโดยใช้การรวม ESI

ปัญหาของฉันคือการตอบสนองอัปสตรีมรวมถึงคุกกี้เซสชันที่เข้ารหัส ซึ่งมีโทเค็น CSRF (ไม่มีพื้นที่จัดเก็บเซสชันฝั่งเซิร์ฟเวอร์เลย)

สำหรับคำขอเริ่มต้น (ไม่มีคุกกี้ในคำขอ) คำขอ ESI จะไม่รวมคุกกี้ที่กำหนดโดยการตอบสนองครั้งแรกจากเซิร์ฟเวอร์อัพสตรีม

ฉันได้ลองตั้งค่าแล้ว คำขอhttp.Cookie ใน vcl_deliver hook เนื่องจากเป็นที่เดียวในโฟลว์คำขอที่ฉันพบทั้งสองที่ ความต้องการ และ ความละเอียด สามารถเข้าถึงได้ R / W อย่างไรก็ตาม การดูคำขอด้วย varnishlog จะพบว่าคำขอ ESI ไม่ได้รับผลกระทบและไม่รวมคุกกี้

ฉันพยายามอย่างเต็มที่ในการสืบค้นข้อมูลในเอกสารประกอบ แต่ไม่พบสิ่งใดที่เป็นประโยชน์จากระยะไกล

เป็นไปได้ไหมที่จะบรรลุสิ่งที่ฉันต้องการเช่น อัปเดต ความต้องการ เพื่อให้คำขอ ESI รวมคุกกี้ที่ส่งคืนโดยการตอบสนองต้นน้ำเริ่มต้นหรือไม่

Score:1
ธง in

เราจำเป็นต้องแยกให้ชัดเจนระหว่างคำขอที่มี คุกกี้ ส่วนหัวและการตอบกลับที่มี ชุดคุกกี้ หัวข้อ.

สมมติว่าโทเค็น 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 และโค้ด

cn flag
ขอบคุณ! ฉันลืมเกี่ยวกับ `req_top` ไปเสียสนิท
cn flag
เพื่อให้ละเอียดยิ่งขึ้น ฉันแก้ไข `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` ทำงานรักษา โชคดีที่ไม่จำเป็นต้องใช้ vars ทั่วโลก

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา