ตรวจสอบ IP Address และ Hostname
ในบางครั้งเราต้องการตรวจสอบว่าผู้ที่เข้ามาเยี่ยมชมเว็บไซต์ของเราหรือผู้ที่มาโพสข้อความในเวบบอร์ดของเรานั้นมาจากที่ใด ซึ่งวิธีการที่ง่ายและเป็นที่นิยมใช้กันก็คือการตรวจสอบ IP Address ของเครื่องผู้ชมที่เปิดดูเว็บไซต์ของเรานั่นเอง โดยหลักการในการตรวจสอบ IP Address นี้ทำได้โดยการตรวจจาก Predefined Variable ของเว็บเซิร์ฟเวอร์ที่เราใช้งานอยู่ ซึ่ง Predefined Variable นี้จะเป็นตัวแปรที่สร้างขึ้นมาโดยอัติโนมัติทุกครั้งที่มีการรันสคริปของPHP
Predefine Variable ที่เก็บค่า IP Address ของผู้ใช้ไว้ก็คือ REMOTE_ADDR ดังนั้นเมื่อเราต้องการตรวจสอบค่า IP Address ของผู้ใข้ เราจะใช้ฟังก์ชัน getenv ในการดึงเอาค่าของ Predefined Variable นี้มาเก็บไว้ในตัวแปร $ip ดังนี้
<?
$ip=getenv(REMOTE_ADDR);
print “Your IP Address is $ip”;
?>
ผลลัพธ์ที่ได้คือ
Your IP Address is 127.0.0.1
จะเห็นได้ว่าโปรแกรมนี้สามารถตรวจสอบ IP Address ของผู้ใช้ได้ในระดับหนึ่ง แต่จะมีปัญหาในกรณีที่เครื่องผู้ใช้ได้ทำการปรับแต่งเครื่องให้ใช้ Proxy Server ซึ่งแทนที่เราจะได้ IP Address ของเครื่องผู้ใช้ เราก็จะได้รับ IP Address ของ Proxy Server แทน หรือในบางกรณีเราอาจจะได้ IP Address ของ Cache Server ของ ISP ที่ผู้ใช้ได้ใช้บริการอยู่ ดังนั้น ในกรณีที่เกิดเหตุการณ์นี้ตัวแปร REMOTE_ADDR จะไม่ได้เก็บ IP Address ที่แท้จริงของเครื่องผู้ใช้แต่จะเก็บ IP Address ของ Proxy Server หรือ Cache Server และจะเกิดตัวแปร HTTP_X_FORWARDED_FOR ขึ้นมา ซึ่งจะเป็นตัวแปรที่เก็บ IP Address ที่แท้จริงของเครื่องผู้ใช้แทน ดังนั้นเราจะทำการแก้โปรแกรมข้างต้นของเราเพื่อให้เก็บ IP Address ได้อย่างถูกต้อง ดังนี้
<?php
if (getenv(HTTP_X_FORWARDED_FOR))
$ip=getenv(HTTP_X_FORWARDED_FOR);
else
$ip=getenv(REMOTE_ADDR);
print “Your IP Address is $ip”;
?>
ในโปรแกรมของเรานั้นเริ่มต้น เราจะทำการเช็คดูก่อนว่าตัวแปร HTTP_X_FORWARDED_FOR นั้นมีการเซ็ตไว้หรือเปล่า ถ้ามีการเซ็ตไว้แสดงว่ามีการใช้ Proxy Server หรือ Cache Server ดังนั้นตัวแปร HTTP_X_FORWARDED_FOR ก็จะเก็บ IP Address ที่แท้จริงไว้ ดังนั้นเราก็จะใช้ค่าจากตัวแปรนี้ แต่ถ้าไม่มีการเซ็ตตัวแปรนี้ไว้ เราก็จะเก็บค่า IP Address จากตัวแปร REMOTE_ADDR ตามปกติ
สำหรับชื่อของ Predefined Variable ที่เราใช้ในที่นี้คือ REMOTE_ADDR และ HTTP_X_FORWARDED_FOR อาจจะมีชื่อที่แตกต่างกันไปได้ ขึ้นอยู่กับว่าเราใช้เว็บเซิร์ฟเวอร์อะไร โดยในที่นี้เราจะอ้างอิงจาก Apache Webserver เป็นหลัก โดยถ้าเราใช้ [/b]Web Server อื่นนอกจาก Apache และต้องการตรวจสอบว่ามี Predefined Variable อะไรบ้างก็สามารถตรวจสอบได้ โดยใช้ฟังก์ชัน phpinfo() เพื่อตรวจสอบดังนี้
<?
phpinfo();
?>
โดยฟังก์ชันนี้จะแสดงตัวแปรที่เป็น Predefined Variable ทั้งหมดออกมา
ลำดับต่อไปเมื่อเราได้หมายเลข IP Address มาแล้ว เช่น 203.151.206.76 แล้วเราจะรู้ได้อย่างไรว่า IP Address หมายเลขนี้นี้มีชื่อโฮสต์ว่าอะไร หรือว่าบางท่านอยากจะทราบว่าเวบไซต์ http://www.cnn.com เนี่ย มีหมายเลข IP เป็นอะไร ซึ่ง PHP นั้นก็มีฟังก์ชันที่ช่วยอำนวยความสะดวกให้กับผู้ใช้ในการตรวจสอบหมายเลข IP Address จากชื่อโอสต์หรือแม้กระทั่งตรวจสอบชื่อโอสต์จากหมายเลข IP Address ที่กำหนดมาให้
ในการตรวจสอบชื่อโฮสต์จาก IP Address ที่กำหนดให้ เราจะใช้ฟังก์ชัน gethostbyaddr() ซึ่งฟังก์ชันนี้จะรับ IP Address เป็นพารามิเตอร์และจะ return ชื่อโฮสต์กลับมา แต่ถ้าไม่สามารถตรวจสอบชื่อโฮสต์ได้ก็จะ return ค่า IP Address นั้นกลับมาคืน ตัวอย่างการใช้งานมีดังนี้
<?
$ip = “203.151.206.76”;
$host = gethostbyaddr($ip);
print “Host name for $ip is $host”;
?>
ผลลัพธ์ที่ได้ คือ
Host name for 203.151.206.76 is host76.pantip.com
ในการตรวจสอบ IP Address จากชื่อโฮสต์ที่กำหนดให้ เราจะใช้ฟังก์ชัน gethostbyname() ซึ่งฟังก์ชันนี้จะรับชื่อโฮสต์ เป็นพารามิเตอร์และจะ return IP Address กลับมา แต่ถ้าไม่สามารถตรวจสอบ IP Address ได้ก็จะ return ชื่อโฮสต์นั้นกลับมาคืน ตัวอย่างการใช้งานมีดังนี้
Code:
<?
$host = “www.yahoo.com”;
$ip = gethostbyname($host);
print “IP Address for $host is $ip”;
?>
ผลลัพธ์ที่ได้ คือ
Code:
IP Address for www.yahoo.com is 66.218.71.95
บางโฮสต์อาจจะมี IP Address ที่อ้างถึงมากกว่านี้ ดังนั้นวิธีการตรวจสอบว่าโอสต์นี้มี IP Address ทั้งหมดเท่าไหร่นั้น เราจะใช้ฟังก์ชัน gethostbynamel() มาช่วยแทน โดยฟังก์ชันนี้จะทำการเก็บ IP Address ที่มีทั้งหมดไว้ใน array ซึ่งตัวอย่างการใช้งานมีดังนี้
Code:
<?
$host=”www.microsoft.com”;
$ip = gethostbynamel($host);
for ($i=0; $i<count($ip); $i++)
{
print $ip[$i].”<BR>”;
}
?>
ผลลัพธ์ที่ได้คือ
207.46.249.27
207.46.134.190
207.46.249.190
207.46.134.155
207.46.249.222