Codeigniter ได้ปล่อยเวอร์ชั่นใหม่ออกมาเมื่อ 28 พย. 54 คือเวอร์ชั่น 2.1.0
และคิดว่าหลายๆคนจะเจอปัญหาหนึ่งที่เคยทำงานได้ปกติ แต่จู่ๆกลับทำงานไม่ได้ นั่นคือปัญหาการ upload, upload class นั่นเอง
ใน change log ของ CI ได้บอกไว้ว่าพวกเขาได้เพิ่มการตรวจสอบ mime จากไฟล์จริงๆ ซึ่งการตรวจจาก $_FILE['file']['type'] นั้นไม่พอเพียงต่อความปลอดภัย เพราะสามารถถูกปลอม header หลอกเอาได้
ทำให้พวกเขาเพิ่ม method ใหม่เข้ามาใน upload class นั่นคือ _file_mime_type()
ภายใน method _file_mime_type() ของ 2.1.0 จะแบ่งการทำงานตามเวอร์ชั่นของ php คือตั้งแต่ 5.3 ขึ้นไปจะใช้ fileinfo ในการตรวจ mime type ซึ่งถ้าใครใช้ php5.3 ก็จะทำงานได้ปกติไม่มีปัญหา
ต่อมา เมื่อถ้าไม่ใช่ php5.3 ก็จะตรวจว่ามีฟังก์ชั่น mime_content_type หรือไม่ ถ้ามีก็จะใช้ฟังก์ชั่นนี้ทำงานตรวจ mime type ซึ่ง php5.2 ลงมาส่วนใหญ่จะมีและเปิดใช้งาน แต่ ฟังก์ชั่นดังกล่าวไม่สามารถอ่านค่า mime ที่แท้จริงได้อย่างถูกต้อง มันจึงเกิดปัญหาขึ้นมา
ลำดับต่อมาจาก mime_content_type ก็จะใช้โปรแกรมจากเครืองฝั่ง linux โดยผ่านฟังก์ชั่น exec ซึ่งตรงนี้คิดว่าไม่มีปัญหา
แก้ปัญหา
เปิดไฟล์ system/libraries/Upload.php
หลังจากที่ได้วิเคราะห์ลึกลงไปแล้วพบว่าปัญหาเกิดจากฟังก์ชั่น mime_content_type ก็จะลงไปแก้ที่ตรงนั้น
โค้ดจากไฟล์ต้นฉบับของ codeigniter 2.1.0
// Fall back to the deprecated mime_content_type(), if available
if (function_exists('mime_content_type'))
{
$this->file_type = @mime_content_type($file['tmp_name']);
return;
}
ให้ทำการคอมเม้นโค้ดตั้งแต่บรรทัด if (function_exists('mime_content_type')) ...ไปจนถึง... }
เพื่อไม่ให้ทำการตรวจ mime type ด้วยการใช้ฟังก์ชั่น mime_content_type
ซึ่งมันตรวจสอบไฟล์ไม่ถูกต้องในทุกประเภท เช่น .zip แทนที่จะได้ application/x-zip, application/zip, application/x-zip-compressed กลับได้เป็น text/plain