ฉันได้ดูโพสต์กลุ่มข่าวในPHP Internalsและพบการสนทนาที่น่าสนใจเกี่ยวกับหัวข้อนี้ หัวข้อแรกคือเกี่ยวกับสิ่งอื่น แต่คำพูดโดย Stefan Esser เป็น (ถ้าไม่) ผู้เชี่ยวชาญด้านความปลอดภัยในโลก PHP เปิดการสนทนาที่มีต่อผลกระทบการรักษาความปลอดภัยของการใช้ $ _REQUEST สำหรับการโพสต์ไม่กี่
อ้างถึงStefan Esser ใน PHP Internals
$ _REQUEST เป็นจุดอ่อนด้านการออกแบบที่ใหญ่ที่สุดอย่างหนึ่งใน PHP ทุกแอปพลิเคชันที่ใช้ $ _REQUEST มักเสี่ยงต่อปัญหาการปลอมแปลงคำขอข้ามไซต์ที่ล่าช้า (โดยทั่วไปหมายความว่าหากมีคุกกี้ชื่อ (อายุ) อยู่มันจะเขียนทับเนื้อหา GET / POST เสมอดังนั้นการร้องขอที่ไม่ต้องการจะถูกดำเนินการ)
และในภายหลังตอบกลับเธรดเดียวกัน
ไม่เกี่ยวกับการที่ใครบางคนสามารถปลอม GET, POST; ตัวแปร COOKIE เป็นเรื่องเกี่ยวกับข้อเท็จจริงที่ว่าคุกกี้จะเขียนทับข้อมูล GET และ POST ใน REQUEST
ดังนั้นฉันสามารถทำให้เบราว์เซอร์ของคุณติดเชื้อด้วยคุกกี้ที่ระบุว่าเช่น action = logout และตั้งแต่วันนั้นเป็นต้นมาคุณไม่สามารถใช้แอปพลิเคชันได้อีกต่อไปเนื่องจาก REQUEST [action] จะถูกล็อกเอาต์ตลอดไป (จนกว่าคุณจะลบคุกกี้ด้วยตนเอง)
และการทำให้คุณติดคุกกี้นั้นง่ายมาก
ก) ฉันสามารถใช้ XSS vuln ในแอปพลิเคชันใดก็ได้บนโดเมนย่อย
b) เคยลองตั้งค่าคุกกี้สำหรับ * .co.uk หรือ * .co.kr เมื่อคุณเป็นเจ้าของ โดเมนเดียวมีไหม
c) ข้ามโดเมนอื่น ๆ ไม่ว่าจะด้วยวิธีใดก็ตาม ...
และถ้าคุณเชื่อว่านี่ไม่ใช่ปัญหาฉันสามารถบอกคุณได้ว่ามีความเป็นไปได้ง่ายๆในการตั้งค่าคุกกี้ * .co.kr ที่ส่งผลให้ PHP หลายเวอร์ชันกลับมาเป็นไวท์เพจ ลองนึกภาพ: เพียงคุกกี้เดียวเพื่อฆ่าหน้า PHP ทั้งหมดใน * .co.kr
และด้วยการตั้งรหัสเซสชันที่ผิดกฎหมายในคุกกี้ที่ถูกต้องสำหรับ * .co.kr ในตัวแปรที่เรียกว่า + PHPSESSID = ผิดกฎหมายคุณยังคงสามารถ DOS ทุกแอปพลิเคชัน PHP ในเกาหลีโดยใช้เซสชัน PHP ...
การสนทนายังคงดำเนินต่อไปอีกสองสามโพสต์และน่าสนใจที่จะอ่าน
อย่างที่คุณเห็นปัญหาหลักของ $ _REQUEST ไม่มากนักเนื่องจากมีข้อมูลจาก $ _GET และ $ _POST แต่ยังมาจาก $ _COOKIE บางคนอื่น ๆ ในรายการแนะนำเปลี่ยนแปลงลำดับที่ $ _REQUEST เต็มไปเช่นกรอกด้วย $ _COOKIE แรก แต่นี้อาจนำไปสู่ปัญหามากมายมีศักยภาพอื่น ๆ เช่นกับการจัดการเซสชัน
คุณสามารถละ $ _COOKIES จาก $ _REQUEST global ได้อย่างสมบูรณ์เพื่อที่จะไม่ถูกเขียนทับโดยอาร์เรย์อื่น ๆ (อันที่จริงคุณสามารถ จำกัด การรวมกันของเนื้อหามาตรฐานเช่นคู่มือ PHP ในการตั้งค่าvariable_order iniบอกพวกเรา:
variable_order ตั้งค่าลำดับของการแยกวิเคราะห์ตัวแปร EGPCS (Environment, Get, Post, Cookie และ Server) ตัวอย่างเช่นหากกำหนดค่า variable_order เป็น "SP" PHP จะสร้าง superglobals $ _SERVER และ $ _POST แต่ไม่สร้าง $ _ENV, $ _GET และ $ _COOKIE การตั้งค่าเป็น "" หมายความว่าจะไม่มีการตั้งค่า superglobals
แต่อีกครั้งคุณอาจพิจารณาที่จะไม่ใช้ $ _REQUEST โดยสิ้นเชิงเพียงเพราะใน PHP คุณสามารถเข้าถึง Environment, Get, Post, Cookie และ Server ในโลกของพวกเขาเองและมีเวกเตอร์การโจมตีน้อยกว่าหนึ่งตัว คุณยังคงต้องล้างข้อมูลนี้ แต่สิ่งหนึ่งที่ไม่ต้องกังวล
ตอนนี้คุณอาจสงสัยว่าทำไม $ _REQUEST ถึงมีอยู่และทำไมมันไม่ถูกลบออก สิ่งนี้ถูกถามใน PHP Internals เช่นกัน อ้างถึง Rasmus Lerdorf เกี่ยวกับเหตุใด $ _REQUEST จึงมีอยู่ บน PHP Internals
ยิ่งเราลบสิ่งเหล่านี้ออกไปมากเท่าไหร่ผู้คนก็จะยิ่งเปลี่ยนไปใช้ PHP เวอร์ชันใหม่เร็วขึ้นและปลอดภัยมากขึ้นเท่านั้น นั่นทำให้ทุกคนไม่สบายใจมากกว่าฟีเจอร์เดิมที่ "น่าเกลียด" เพียงเล็กน้อย หากมีเหตุผลทางเทคนิคประสิทธิภาพหรือความปลอดภัยที่เหมาะสมเราจำเป็นต้องพิจารณาอย่างหนัก ในกรณีนี้สิ่งที่เราควรพิจารณาไม่ใช่ว่าเราควรลบ $ _REQUEST หรือไม่ แต่เราควรลบข้อมูลคุกกี้ออกหรือไม่ การกำหนดค่าหลายอย่างทำเช่นนั้นแล้วรวมถึงของฉันเองทั้งหมดและมีเหตุผลด้านความปลอดภัยที่ถูกต้องที่ชัดเจนในการไม่รวมคุกกี้ใน $ _REQUEST คนส่วนใหญ่ใช้ $ _REQUEST เพื่อหมายถึง GET หรือ POST โดยไม่ทราบว่ามันอาจมีคุกกี้ด้วยและคนเลวเหล่านี้อาจใช้เทคนิคการฉีดคุกกี้และทำลายแอปพลิเคชันที่ไร้เดียงสาได้
ยังไงก็หวังว่าคงกระจ่างขึ้นบ้าง