2 ตัวแปรนี้ถูกกำหนดไว้ในไฟล์ php.ini ของทุก server บางที่ก็เปิด on ไว้ บางที่ก็ off ไว้
register_globals = off
หมายความว่า หากเราต้องการรับค่าจากผู้ใช้ เราต้องเขียน code แบบนี้
$user=$_POST['user']; // รับข้อมูลจากฟอร์ม submit
$id=$_GET['id']; // รับข้อมูลจาก url เช่น news.php?id=1
$id=$_SESSION['id']; // รับข้อมูลจากตัวแปร SESSION
register_globals = on
หมายความว่า เราเขียนแค่ $user = $user ก็สามารถรับข้อมูลได้ทั้ง 3 แบบเลย ทั้ง POST, GET, SESSION
วิธีนี้ช่วยให้เขียน code สะดวก แต่ไม่ปลอดภัย ทำให้ถูกโจมตีได้ง่าย
สมมุติเรามี code ว่า
// บันทึกค่าลงฐานข้อมูล
$title = $_POST['title'];
$sql = "update $table_articles set TITLE = '$title' where ID = '1' ";
// อ่านค่าจากฐานข้อมูล
$sql = "select * from $table_articles where ID = '1' ";
$result = mysql_query($sql) or die (mysql_error());
$row = mysql_fetch_array($result);
$title = $row['TITLE'];
เราต้องการส่งค่า ฝนตก\ที่ 'หน้า' "ต่าง" ให้บันทึกในฐานข้อมูลด้วยชื่อ title
สำหรับ server ที่ magic_quotes_gpc = on ให้เขียนแบบนี้
// เวลารับ input ส่งให้ sql บันทึกลงฐานข้อมูล
$title=$_POST['title'];
// อ่านค่าจากฐานข้อมูลมาแสดงในช่อง text box
<input type="text" name="title" value="<?=htmlspecialchars($row['TITLE'])?>">
หรือเขียนแบบนี้ก็ได้
$title=addslashes($_POST['title']);
<input type="text" name="title" value="<?=htmlspecialchars(stripslashes($row['TITLE']))?>">
เขียนสลับกันไม่ได้ เดี๋ยวค่าที่อ่านได้จะเพี้ยน เช่น เขียนแบบนี้
$title=addslashes($_POST['title']);
<input type="text" name="title" value="<?=htmlspecialchars($row['TITLE'])?>">
ค่าที่อ่านได้จะกลายเป็น ฝนตก\\ที่ \'หน้า\' \"ต่าง\"
หรือถ้าเขียนแบบนี้
$title=$_POST['title'];
<input type="text" name="title" value="<?=htmlspecialchars(stripslashes($row['TITLE']))?>">
ค่าที่อ่านได้จะกลายเป็น ฝนตกที่ 'หน้า' "ต่าง"
สำหรับ server ที่ magic_quotes_gpc = off ให้เขียนแบบนี้
$title=addslashes($_POST['title']);
<input type="text" name="title" value="<?=htmlspecialchars($row['TITLE'])?>">
ถ้าเราเขียนแบบนี้
$title=addslashes($_POST['title']);
<input type="text" name="title" value="<?=htmlspecialchars(stripslashes($row['TITLE']))?>">
ค่าที่อ่านได้จะกลายเป็น ฝนตกที่ 'หน้า' "ต่าง"
ก็ไม่เข้าใจเหมือนกันว่าทำไมคนพัฒนา php ถึงกำหนดกฏเกณฑ์ไว้แบบนี้
ปัญหาจะเกิดตอนที่เราย้าย host หรืออัพเกรดเวอร์ชั่นจาก php 5.2 เป็น 5.3
วิธีง่ายๆ หากเจอปัญหา magic_quotes_gpc
คือดูว่า code เดิมของเรา ใช้ค่า magic_quotes_gpc = off หรือ on
แล้วเวลาย้ายไป host ใหม่ เราสร้างไฟล์ .htaccess ไว้ที่ public_html แล้วเขียนว่า
php_flag register_globals on
php_flag magic_quotes_gpc on
แค่นี้เราก็สามารถกำหนดค่า magic_quotes_gpc ให้ on หรือ off ก้ได้
ตามรูปแบบ code php ที่เราเคยเขียนไว้
แต่ถ้ามีเวลา ควรตั้งทั้ง 2 ค่าให้เป็น off แล้วปรับ code ของเราไม่ให้ error จะดีกว่า
เพราะในอนาคต ตั้งแต่ php 5.4 ขึ้นไป ทั้ง 2 ค่า จะถูกกำหนดเป็น off ถาวร
28 ม.ค. 57