Download Articles Stats About us Contact us
HomePHP

เรื่องน่ารู้ของ register_globals และ magic_quotes_gpc

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
© 2000 - 2024 palthai.com. All rights reserved.