ฉันพยายามเข้าใจปัญหาทั้งหมดด้วย CSRF และวิธีที่เหมาะสมในการป้องกัน (ทรัพยากรที่ฉันได้อ่านทำความเข้าใจและเห็นด้วยกับ: OWASP CSRF ป้องกันแผ่นโกง , คำถามเกี่ยวกับ CSRF .)
ตามที่ฉันเข้าใจแล้วช่องโหว่รอบ ๆ CSRF ถูกนำเสนอโดยการสันนิษฐานว่า (จากมุมมองของเว็บเซิร์ฟเวอร์) คุกกี้เซสชันที่ถูกต้องในคำขอ HTTP ขาเข้าที่สะท้อนถึงความต้องการของผู้ใช้ที่ผ่านการรับรองความถูกต้อง แต่คุกกี้ทั้งหมดสำหรับโดเมนต้นทางนั้นแนบมากับเบราว์เซอร์อย่างน่าอัศจรรย์ดังนั้นจริงๆแล้วเซิร์ฟเวอร์ทั้งหมดสามารถอนุมานจากการมีคุกกี้เซสชันที่ถูกต้องในคำขอคือคำขอนั้นมาจากเบราว์เซอร์ที่มีเซสชันที่มีการรับรองความถูกต้อง มันไม่สามารถคิดอะไรเกี่ยวกับรหัสได้อีกใช้งานในเบราว์เซอร์นั้นหรือไม่ว่ามันจะสะท้อนถึงความต้องการของผู้ใช้จริงหรือไม่ วิธีการป้องกันสิ่งนี้คือการรวมข้อมูลการรับรองความถูกต้องเพิ่มเติม ("โทเค็น CSRF") ในคำขอซึ่งดำเนินการด้วยวิธีการอื่นนอกเหนือจากการจัดการคุกกี้อัตโนมัติของเบราว์เซอร์ คุกกี้เซสชั่นรับรองความถูกต้องของผู้ใช้ / เบราว์เซอร์และโทเค็น CSRF รับรองความถูกต้องของรหัสที่ทำงานในเบราว์เซอร์
ดังนั้นหากคุณใช้คุกกี้เซสชันเพื่อตรวจสอบสิทธิ์ผู้ใช้แอปพลิเคชันเว็บของคุณคุณควรเพิ่มโทเค็น CSRF ในการตอบกลับแต่ละครั้งและต้องการโทเค็น CSRF ที่ตรงกันในแต่ละคำขอ (กลายพันธุ์) จากนั้นโทเค็น CSRF จะทำการส่งไปกลับจากเซิร์ฟเวอร์หนึ่งไปยังเบราว์เซอร์กลับไปที่เซิร์ฟเวอร์เพื่อพิสูจน์ว่าเซิร์ฟเวอร์ที่หน้านั้นร้องขอนั้นได้รับการอนุมัติจาก (สร้างโดย, แม้แต่) เซิร์ฟเวอร์นั้น
ตามคำถามของฉันซึ่งเกี่ยวกับวิธีการขนส่งเฉพาะที่ใช้สำหรับโทเค็น CSRF นั้นในการไปกลับนั้น
ดูเหมือนเป็นเรื่องธรรมดา (เช่นในAngularJS , Django , Rails ) เพื่อส่งโทเค็น CSRF จากเซิร์ฟเวอร์ไปยังไคลเอนต์เป็นคุกกี้ (เช่นในส่วนหัว Set-Cookie) จากนั้นให้ Javascript ในไคลเอนต์หลุดออกจากคุกกี้และแนบ เป็นส่วนหัว XSRF-TOKEN ที่แยกต่างหากเพื่อส่งกลับไปยังเซิร์ฟเวอร์
(วิธีอื่นเป็นวิธีที่แนะนำโดยเช่นExpressซึ่งโทเค็น CSRF ที่สร้างโดยเซิร์ฟเวอร์จะรวมอยู่ในเนื้อหาการตอบสนองผ่านการขยายเทมเพลตฝั่งเซิร์ฟเวอร์แนบโดยตรงกับโค้ด / มาร์กอัปที่จะส่งกลับไปยังเซิร์ฟเวอร์เช่น เป็นรูปแบบการป้อนข้อมูลที่ซ่อนอยู่ตัวอย่างนั้นเป็นอีกวิธีหนึ่งในการทำสิ่งต่าง ๆ บนเว็บ 1.0-ish แต่จะพูดคุยกับลูกค้า JS-heavy มากขึ้น)
ทำไมมันจึงเป็นเรื่องธรรมดาที่จะใช้ Set-Cookie เป็นการส่งข้อมูลแบบดาวน์สตรีมสำหรับโทเค็น CSRF / ทำไมจึงเป็นความคิดที่ดี ฉันจินตนาการว่าผู้เขียนกรอบการทำงานทั้งหมดพิจารณาตัวเลือกของพวกเขาอย่างรอบคอบและไม่ผิดพลาด แต่เมื่อเหลือบมองครั้งแรกการใช้คุกกี้เพื่อแก้ไขสิ่งที่เป็นข้อ จำกัด ในการออกแบบคุกกี้ดูเหมือนจะบ้าคลั่ง ในความเป็นจริงถ้าคุณใช้คุกกี้เป็นการขนส่งแบบไปกลับ (Set-Cookie: header downstream สำหรับเซิร์ฟเวอร์เพื่อบอกเบราว์เซอร์ CSRF โทเค็นและ Cookie: header upstream สำหรับเบราว์เซอร์เพื่อส่งคืนไปยังเซิร์ฟเวอร์) คุณจะแนะนำช่องโหว่ใหม่ กำลังพยายามแก้ไข
ฉันตระหนักว่ากรอบการทำงานข้างต้นไม่ได้ใช้คุกกี้ตลอดการเดินทางไปสู่โทเค็น CSRF พวกเขาใช้ Set-Cookie ดาวน์สตรีมแล้วอย่างอื่น (เช่นส่วนหัว X-CSRF-Token) อัปสตรีมและสิ่งนี้จะปิดช่องโหว่ แต่ถึงกระนั้นการใช้ Set-Cookie เป็นการนำส่งข้อมูลแบบดาวน์สตรีมอาจทำให้เข้าใจผิดและเป็นอันตราย เบราว์เซอร์จะแนบโทเค็น CSRF กับทุกคำขอรวมถึงคำขอ XSRF ที่เป็นอันตรายของแท้ อย่างดีที่สุดที่ทำให้คำขอมีขนาดใหญ่เกินกว่าที่จะเป็นและที่เลวร้ายที่สุดมีความหมายดี แต่ชิ้นส่วนของรหัสเซิร์ฟเวอร์ที่เข้าใจผิดอาจลองใช้งานจริงซึ่งอาจจะแย่มาก และยิ่งไปกว่านั้นเนื่องจากผู้รับเป้าหมายที่แท้จริงของโทเค็น CSRF คือ Javascript ฝั่งไคลเอ็นต์นั่นหมายความว่าคุกกี้นี้ไม่สามารถป้องกันด้วย http เท่านั้น