Codeigniter 2.1.0 อัพโหลดไม่ได้!

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

เขียนความคิดเห็น

ชื่อ:
ความคิดเห็น:
 
ความคิดเห็นของคุณต้องรอการตรวจจากผู้ดูแลก่อนที่จะเผยแพร่สู่สาธารณะ.