ไม่ได้เขียนเกี่ยวกับ PHP นานวันนี้มาว่ากันด้วยเรื่อง Security เล็กๆใน php กันครับ
หลายๆท่านคงเขียน web applicaton มาบ้างแล้ว และคงใช้งานการ include ไฟล์ที่เก็บไว้ในไฟล์เช่น การติดต่อ Database ตัวอย่างเช่นไฟล์ dbconnect.php หรือ dbconnect.inc.php และชื่ออื่นๆ
<?
$host = "localhost";
$user = "username";
$pass = "password";
$databasename = "dbname";
$link = mysql_connect($host, $user, $pass);
mysql_select_db($dbname, $link);
.......
?>
ประมาณนี้ใช่ไหมครับ แล้วก็ เรียกใช้งานโดยการ include เข้าไปทุกครั้งที่ต้องการติดต่อ database เช่น
<?
include("dbconnect.php");
?>
ประมาณนี้ใช่ไหมครับ คงสงสัยว่าแล้วมันไม่ดีตรงไหนล่ะ ความปลอดภัยไม่มีตรงไหน ผมยกตัวอย่างเช่น
ผมจำลองเครื่องที่บ้านแล้วเขียนโค๊ดว่า
<?
print_r(file("http://forum.modoeye.com/dbconnect.php"));
?>
หรือ
<?
$file = "http://forum.modoeye.com/dbconnect.php";
$fp = fopen($file, "r");
$str = fread($fp, filesize($file));
fclose($fp);
echo $str;
?>
หรือ
<?
include("http://forum.modoeye.com/dbconnect.php");
$res = mysql_query("SHOW TABLES", $link);
?>
คิดว่าไงครับ จากโค๊ดตามตัวอย่างจะเกิดอะไรขึ้นบ้าง ครับผมรู้ข้อมูลทั้งหมดที่อยู่ในไฟล์ในสองตัวอย่างแรก ในตัวอย่างสุดท้ายผมสามารถใช้งานตัวแปร $link ในการใช้งานได้เลย
ปัญหาคือแล้วจะทำไงดีล่ะ
การป้องกันคือทำอย่างไรก็ได้ให้ include หรือ เปิดไฟล์ได้เฉพาะเราเท่านั้น
ผมเสนอวิธีการง่ายๆ แต่ได้ผลดีครับ
ขั้นแรกในไฟล์ dbconnect.php นั้น ให้ใส่
<?
if(!defined("MY_KEYWORD") || MY_KEYWORD !== true){
die("Hacking attemp...exiting");
exit;
}
$host = "localhost";
$user = "username";
$pass = "password";
$databasename = "dbname";
$link = mysql_connect($host, $user, $pass);
mysql_select_db($dbname, $link);
.......
?>
เป็นการตรวจสอบว่ามีการประการค่าคงที่ชื่อ MY_KEYWORD ไว้หรือไม่ถ้ามีแล้วมีค่าเป็น true หรือไม่ ถ้าไม่มีก็ให้แสดงข้อความ "Hacking attemp...exiting" แล้วจบการทำงาน ลองทดสอบด้วยการเรียกใช้งานไฟล์โดยตรงดูครับ หรือ include ไฟล์เข้าไปดูครับ จะไม่สามารถทำงานได้
การจะให้ include แล้วทำงานได้นั้นในไฟล์ที่ต้องการใช้งานนั้นเพียงแค่ใส่
<?
define("MY_KEYWORD", true);
include("dbconnect.php");
?>
ทุกครั้งก่อนใช้งานครับ จะสามารถใช้งานได้เป็นปกติ ส่วนตัวแปร MY_KEYWORD และค่า true นั้นทุกท่านก็เปลี่ยนเป็นคำและค่าที่แต่ละท่านต้องการได้เลยครับ ใช้คนเดียวรู้คนเดียวไม่มีใครสามารถเอาข้อมูลภายในไปได้ครับ
หลายๆท่านคงเขียน web applicaton มาบ้างแล้ว และคงใช้งานการ include ไฟล์ที่เก็บไว้ในไฟล์เช่น การติดต่อ Database ตัวอย่างเช่นไฟล์ dbconnect.php หรือ dbconnect.inc.php และชื่ออื่นๆ
<?
$host = "localhost";
$user = "username";
$pass = "password";
$databasename = "dbname";
$link = mysql_connect($host, $user, $pass);
mysql_select_db($dbname, $link);
.......
?>
ประมาณนี้ใช่ไหมครับ แล้วก็ เรียกใช้งานโดยการ include เข้าไปทุกครั้งที่ต้องการติดต่อ database เช่น
<?
include("dbconnect.php");
?>
ประมาณนี้ใช่ไหมครับ คงสงสัยว่าแล้วมันไม่ดีตรงไหนล่ะ ความปลอดภัยไม่มีตรงไหน ผมยกตัวอย่างเช่น
ผมจำลองเครื่องที่บ้านแล้วเขียนโค๊ดว่า
<?
print_r(file("http://forum.modoeye.com/dbconnect.php"));
?>
หรือ
<?
$file = "http://forum.modoeye.com/dbconnect.php";
$fp = fopen($file, "r");
$str = fread($fp, filesize($file));
fclose($fp);
echo $str;
?>
หรือ
<?
include("http://forum.modoeye.com/dbconnect.php");
$res = mysql_query("SHOW TABLES", $link);
?>
คิดว่าไงครับ จากโค๊ดตามตัวอย่างจะเกิดอะไรขึ้นบ้าง ครับผมรู้ข้อมูลทั้งหมดที่อยู่ในไฟล์ในสองตัวอย่างแรก ในตัวอย่างสุดท้ายผมสามารถใช้งานตัวแปร $link ในการใช้งานได้เลย
ปัญหาคือแล้วจะทำไงดีล่ะ
การป้องกันคือทำอย่างไรก็ได้ให้ include หรือ เปิดไฟล์ได้เฉพาะเราเท่านั้น
ผมเสนอวิธีการง่ายๆ แต่ได้ผลดีครับ
ขั้นแรกในไฟล์ dbconnect.php นั้น ให้ใส่
<?
if(!defined("MY_KEYWORD") || MY_KEYWORD !== true){
die("Hacking attemp...exiting");
exit;
}
$host = "localhost";
$user = "username";
$pass = "password";
$databasename = "dbname";
$link = mysql_connect($host, $user, $pass);
mysql_select_db($dbname, $link);
.......
?>
เป็นการตรวจสอบว่ามีการประการค่าคงที่ชื่อ MY_KEYWORD ไว้หรือไม่ถ้ามีแล้วมีค่าเป็น true หรือไม่ ถ้าไม่มีก็ให้แสดงข้อความ "Hacking attemp...exiting" แล้วจบการทำงาน ลองทดสอบด้วยการเรียกใช้งานไฟล์โดยตรงดูครับ หรือ include ไฟล์เข้าไปดูครับ จะไม่สามารถทำงานได้
การจะให้ include แล้วทำงานได้นั้นในไฟล์ที่ต้องการใช้งานนั้นเพียงแค่ใส่
<?
define("MY_KEYWORD", true);
include("dbconnect.php");
?>
ทุกครั้งก่อนใช้งานครับ จะสามารถใช้งานได้เป็นปกติ ส่วนตัวแปร MY_KEYWORD และค่า true นั้นทุกท่านก็เปลี่ยนเป็นคำและค่าที่แต่ละท่านต้องการได้เลยครับ ใช้คนเดียวรู้คนเดียวไม่มีใครสามารถเอาข้อมูลภายในไปได้ครับ

















