เปิด/ปิด register_globals ต่างกันอย่างไร

สมัยก่อน (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 หลักๆ มีดังนี้ครับ

  1. $_GET    : ค่าตัวแปรที่รับจาก URL (ที่อยู่หลังเครื่องหมาย ? )
  2. $_POST      : ค่าตัวแปรที่รับจาก input ใน <form> ที่ attribute method เป็น post
  3. $_SESSION     : ตัวแปรที่เก็บใน session
  4. $_COOKIE      : ตัวแปรที่เก็บใน cookie
Posted in PHP

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.