สมัยก่อน (PHP รุ่นก่อนเวอร์ชั่น 4.2.1) ตัวแปรที่ส่งมาจากภายนอก ( GET, POST ) และตัวแปร SESSION จะใช้ปนกับตัวแปรที่ใช้ภายในโปรแกรมเลย
ต่อมาหลังจากเวอร์ชั่น 4.2.1 php ก็ได้พัฒนาให้การรับค่าตัวแปรรัดกุมขึ้น โดยใช้ตัวแปรแยกออกมาสำหรับ GET, POST และ SESSION แต่ก็เปิดให้ผู้พัฒนาเว็บไซต์สามารถเลือกกลับไปใช้แบบเก่าได้ ด้วยการเปิด register_globals ซึ่งสามารถตั้งในไฟล์ .htaccess หรือถ้าเป็นเซิร์ฟเวอร์ของคุณเอง คุณสามารถที่จะตั้งใน php.ini ก็ได้ เพื่อให้มีผลกับทั้งเซิร์ฟเวอร์
สามารถอ่านรายละเอียดเกี่ยวกับการเปิด register_globals ด้วยไฟล์ .htaccess ได้ที่นี่
http://www.pathosting.co.th/knowledgebase/Register_globals
คราวนี้ผมจะอธิบาย ยกตัวอย่างเพื่อให้เห็นภาพการรับค่าจาก FORM ที่เป็น method=”POST” ให้ดูครับ
สมมตินี่เป็นโค๊ด HTML ของฟอร์มครับ
<form action="something.php" method="post"> <input type="text" name="fullname" /> <input type="submit" /> </form>
ในกรณีที่ register_globals เป็น On (แบบเก่า)
สามารถเรียกใช้ค่าจากฟอร์มผ่านชื่อของ input ตรงๆ ได้เลย ลักษณะนี้
<?php echo "Welcome {$fullname}";
คุณจะเห็นว่าในรูปแบบเก่ามัน ตัวแปรที่ส่งมาจากฟอร์มจะอยู่ในรูปแบบเดียวกับตัวแปรที่ใช้ในโปรแกรมเลย ดังนั้น Hacker สามารถที่จะส่งตัวแปรอะไรเข้ามาในโปรแกรมของคุณก็ได้ และถ้าโปรแกรมของคุณ เขียนโค๊ดได้ไม่รัดกุมมากพอ ก็จะเป็นช่องโหว่ที่ทำให้โปรแกรมถูก Hack ได้ง่ายๆ ครับ 😐
ในกรณีที่ register_globals เป็น Off (แบบใหม่)
ที่ฝั่งโค๊ด php เวลาเราจะเรียกค่าตัวแปรมาใช้ เราจะต้องเรียกใช้ผ่านตัวแปร $_POST ครับ ลักษณะนี้
<?php echo "Welcome {$_POST['fullname']}";
—-
ตัวแปรที่เกี่ยวข้องกับเรื่อง register_globals หลักๆ มีดังนี้ครับ
- $_GET : ค่าตัวแปรที่รับจาก URL (ที่อยู่หลังเครื่องหมาย ? )
- $_POST : ค่าตัวแปรที่รับจาก input ใน <form> ที่ attribute method เป็น post
- $_SESSION : ตัวแปรที่เก็บใน session
- $_COOKIE : ตัวแปรที่เก็บใน cookie