แก้ปัญหาการเรียก XSS filter ใน codeigniter 2 แล้วได้ขึ้นบรรทัดใหม่ซ้อน 2 ครั้ง

หลังจากที่ Codeigniter 2 ออกมา ก็มาพร้อมกับบั๊กตามเคย ปัญหานี้คือการรับค่า input จาก textarea เข้าไปแล้วเกิดการซ้ำซ้อนของการขึ้นบรรทัดใหม่ (\n หรือ new line)

อ่านแล้วอาจงง จะยกตัวอย่างให้ดูกัน...สมมุติว่าเรากรอก


line1
line 2

ซึ่ง เป็นข้อมูล 2 บรรทัดเท่านั้น เมื่อรับค่าด้วย $this->input->post("textarea_input", true); โดยใส่ ,true เพื่อกรอง XSS จะได้ผลกลับมาเป็น


line1

line2

กลาย เป็นขึ้นบรรทัดใหม่ 2 ครั้ง เป็น 3 บรรทัดทันที. กรณีนี้จะเป็นปัญหาอย่างมากเมื่อมีการ insert แล้วทำการ update ทุกครั้ง จำนวนบรรทัดก็เพิ่มขึ้นเรื่อยๆ x2 ทุกครั้ง

วิธีการแก้ ให้สร้างไฟล์ MY_Input.php ไว้ใน application/core แล้วก๊อปโค้ดต่อไปนี้ใส่ลงไป


class MY_Input extends CI_Input
{

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

    // --------------------------------------------------------------------

    /**
     * Clean Input Data
     *
     * This is a helper function. It escapes data and
     * standardizes newline characters to \n
     *
     * @access private
     * @param string
     * @return string
     */
    public function _clean_input_data($str)
    {
        if (is_array($str)) {
            $new_array = array();
            foreach ($str as $key => $val) {
                $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
            }
            return $new_array;
        }

        // We strip slashes if magic quotes is on to keep things consistent
        if (function_exists('get_magic_quotes_gpc') AND get_magic_quotes_gpc()) {
            $str = stripslashes($str);
        }

        // Clean UTF-8 if supported
        if (UTF8_ENABLED === TRUE) {
            $str = $this->uni->clean_string($str);
        }

        // Should we filter the input data?
        if ($this->_enable_xss === TRUE) {
            $str = $this->security->xss_clean($str);
        }

        // Standardize newlines if needed
        if ($this->_standardize_newlines == TRUE) {
            if (strpos($str, "\r") !== FALSE) {
                $str = str_replace(array("\r\n", "\r"), "\n", $str);
            }
        }

        return $str;
    }
}

/* end of file */

โค้ด ข้างบนจะทำการเปลี่ยน $str = str_replace(array("\r\n", "\r"), PHP_EOL, $str); เป็น $str = str_replace(array("\r\n", "\r"), "\n", $str); ซึ่งจะทำให้แก้ปัญหาขึ้นบรรทัดใหม่ซ้ำซ้อนหายไป

ใส่ความเห็น

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

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