เพิ่มประสิทธิภาพในการตรวจ IP ของ codeigniter 2

เป็นข้อผิดพลาดที่ไม่นึกว่าจะปล่อยให้หลุดออกมาได้สำหรับการตรวจหา IP Address ของ codeigniter ที่มีโค้ดตรวจหา HTTP_X_FORWARDED_FOR แต่ดันไม่สามารถตรวจหาได้.

ความผิดพลาดนี้เกิดจากการลำดับ if แบบผิดๆ ดังนั้นเราจะมาแก้ไขให้มันเสียใหม่ รับรอง work!

สร้างไฟล์ MY_Input.php ไว้ใน application/core

หากยังไม่มีไฟล์ดังกล่าวให้ใช้โค้ดต่อไปนี้


class MY_Input extends CI_Input 
{

    public function __construct()
    {
        parent::__construct();
    }// __construct

    public function ip_address()
    {
        if ( $this->ip_address !== false ) {
            return $this->ip_address;
        }
        // IMPROVED!! CI ip address cannot detect through http_x_forwarded_for. this one can do.
        if (isset($_SERVER['HTTP_CLIENT_IP'])) {
            // //check ip from share internet
            $this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            //to check ip is pass from proxy
            $this->ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $this->ip_address = $_SERVER['REMOTE_ADDR'];
        }
        //
        if ( $this->ip_address === false ) {
            $this->ip_address = "0.0.0.0";
            return $this->ip_address;
        }
        //
        if ( ! $this->valid_ip($this->ip_address)){
            $this->ip_address = '0.0.0.0';
        }
        //
        return $this->ip_address;
    }
}

หากคุณมีไฟล์นี้อยู่แล้ว ให้ก๊อปปี้ไปแค่ส่วน function ip_address() { ไปจนถึง } ก็พอ

จาก นั้นลองอัปโหลดขึ้น server ใส่ proxy ให้เบราเซอร์ แล้วลองเรียกดู ( echo $this->input->ip_address(); ) จะพบว่ามันทำงานได้ปกติ*

*หมายเหตุ
1. ที่ต้องให้ upload ขึ้น server เพราะหากเรียกแบบ localhost จะได้ค่า 127.0.0.1 เสมอ
2. proxy บางตัวไม่สามารถหาค่า X_FORWARDED_FOR ได้

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>