CSRF Security เป็นอิสระจาก Front-End

Sep 29 2020

ฉันกำลังพยายามคิดว่าฉันเข้าใจความปลอดภัย CSRF อย่างสมบูรณ์หรือไม่ ขึ้นอยู่กับ:

https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html

ในทุกสถานการณ์ดูเหมือนว่าส่วนหน้าของคุณจะต้องมีโทเค็น CSRF ที่ใดที่หนึ่งดังนั้นเมื่อคำขอถูกส่งไปยังแบ็กเอนด์จะสามารถเปรียบเทียบโทเค็น csrf ทั้งสองในคุกกี้ / เซสชันกับคำขอได้ ด้วยวิธีนี้เมื่อผู้โจมตีพยายามสร้างคำขอในนามของผู้ใช้ที่ลงชื่อเข้าใช้เนื่องจากไม่มีโทเค็นในคำขอจึงจะไม่ได้รับการตรวจสอบ

ซึ่งหมายความว่าในการใช้งาน CSRF คุณต้องกำหนดค่าทั้งส่วนหน้าและส่วนหลัง

ตอนนี้สมมติว่าฉันต้องการให้การรักษาความปลอดภัย CSRF ทั้งหมดทำในแบ็กเอนด์เป็นไปได้โดยไม่ต้องเปลี่ยนส่วนหน้า?

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

คำตอบ

multithr3at3d Sep 29 2020 at 05:33

ใช่วิธีการหนึ่งในการรับรองการป้องกัน CSRF คือตรวจสอบส่วนหัว Origin และ Referrer เพื่อดูว่าตรงกับต้นทางที่คาดไว้หรือไม่เนื่องจากส่วนหัวเหล่านี้ไม่สามารถเขียนทับด้วยโค้ดส่วนหน้า อย่างไรก็ตามส่วนหัวต้นทางจะถูกส่งไปตามคำขอ POST หรือ CORS เท่านั้นและการใช้เบราว์เซอร์ของส่วนหัวเหล่านี้ไม่สอดคล้องกันในอดีต เช่นอาจอนุญาตให้ JavaScript ปลอมแปลงส่วนหัวอย่างน้อยหนึ่งรายการ (เบราว์เซอร์สมัยใหม่ควรทำงานอย่างถูกต้องแม้ว่าฉันจะไม่สามารถพูดถึงข้อมูลจำเพาะหรือการนำไปใช้งานในอนาคตได้)

การป้องกันนี้จำเป็นต้องใช้การตรวจสอบฝั่งเซิร์ฟเวอร์ในทุกคำขอ POST เท่านั้น สิ่งสำคัญคือต้องปฏิเสธคำขอหากต้นทางที่ส่งไม่ตรงกันหรือหากไม่มีการส่งเลย

OWASP CSRF โกงแผ่นรวมถึงเหตุผลบางอย่างสำหรับเหตุผลที่คุณอาจไม่ต้องการที่จะใช้วิธีการนี้โดยเฉพาะ อย่างไรก็ตามหากคุณไม่เผชิญกับข้อ จำกัด เหล่านี้โดยส่วนตัวแล้วฉันรู้สึกว่าวิธีนี้สามารถใช้แทนวิธีที่ซับซ้อนกว่านี้ได้

นอกจากนี้ยังขึ้นอยู่กับการสนับสนุนเบราว์เซอร์คือตัวเลือกคุกกี้ "SameSite: เข้มงวด" วิธีนี้จะป้องกันไม่ให้ส่งคุกกี้จากไซต์ของบุคคลที่สามเลยรวมถึงลด CSRF ด้วย