อัพเดท 13/07/2017 [ปัญหาถูกแก้ไขแล้ว]
ทีมงานวีโอไอพีได้เปิดตัวSUPEE-9767 V2ในแพทช์เวอร์ชั่นนี้ปัญหาเกี่ยวกับ gif ที่โปร่งใสและ png's ได้รับการแก้ไข
คุณควรย้อนกลับการเปลี่ยนแปลงทั้งหมดไปยังไฟล์ที่กล่าวถึงในหัวข้อนี้ จากนั้นคืนแพทช์ V1 ที่ใช้แล้วและใช้เวอร์ชัน V2 ใหม่ในที่สุด
PRE - SUPEE-9767 V2
กรุณาอย่าใช้รหัสที่กล่าวถึงการร้องแทนการใช้ V2 ของแพทช์ปัญหาที่กล่าวถึงการร้องได้รับการแก้ไขแล้วในรุ่นนี้
หากใครบางคนประสบปัญหากับ png โปร่งใสที่เมื่ออัปโหลดจากแผงผู้ดูแลระบบพื้นหลังจะกลายเป็นสีดำ (เกี่ยวกับผลิตภัณฑ์) ที่เกี่ยวข้องกับการโทรกลับอัพโหลดภาพแนะนำใน:
app/code/core/Mage/Adminhtml/controllers/Catalog/Product/GalleryController.php
ในช่วงเวลาที่ฉันไม่แน่ใจว่าสิ่งที่ก่อให้เกิดพฤติกรรมนี้ แต่ฉันพยายามที่จะคิดออกฉันสามารถยืนยันได้ว่าเมื่อโทรกลับถูกลบออกพฤติกรรมแปลก ๆ จะหายไป
UPDATE
ตกลงฉันพบว่าฟังก์ชั่นที่ได้รับการปรับปรุงจาก SUPEE-9767 นี่เป็นการทำลายความโปร่งใสใน png ของสำเนาภาพต้นฉบับที่สร้างขึ้นโดยไม่มีความโปร่งใส
+++ app/code/core/Mage/Core/Model/File/Validator/Image.php
@@ -87,10 +87,33 @@ public function setAllowedImageTypes(array $imageFileExtensions = array())
*/
public function validate($filePath)
{
- $fileInfo = getimagesize($filePath);
- if (is_array($fileInfo) and isset($fileInfo[2])) {
- if ($this->isImageType($fileInfo[2])) {
- return null;
+ list($imageWidth, $imageHeight, $fileType) = getimagesize($filePath);
+ if ($fileType) {
+ if ($this->isImageType($fileType)) {
+ //replace tmp image with re-sampled copy to exclude images with malicious data
+ $image = imagecreatefromstring(file_get_contents($filePath));
+ if ($image !== false) {
+ $img = imagecreatetruecolor($imageWidth, $imageHeight);
+ imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
+ switch ($fileType) {
+ case IMAGETYPE_GIF:
+ imagegif($img, $filePath);
+ break;
+ case IMAGETYPE_JPEG:
+ imagejpeg($img, $filePath, 100);
+ break;
+ case IMAGETYPE_PNG:
+ imagepng($img, $filePath);
+ break;
+ default:
+ return;
+ }
+ imagedestroy($img);
+ imagedestroy($image);
+ return null;
+ } else {
+ throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid image.'));
+ }
}
}
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
UPDATE
นี่คือฟังก์ชั่นที่อัพเดตเวอร์ชั่นเพื่อรักษาความโปร่งใสของ png
imagealphablending($img, false);
imagesavealpha($img, true);
ต้องเพิ่มสองบรรทัดนี้ในแพทช์ อัปเดตฟังก์ชั่นในapp/code/core/Mage/Core/Model/File/Validator/Image.php
/**
* Validation callback for checking is file is image
*
* @param string $filePath Path to temporary uploaded file
* @return null
* @throws Mage_Core_Exception
*/
public function validate($filePath)
{
list($imageWidth, $imageHeight, $fileType) = getimagesize($filePath);
if ($fileType) {
if ($this->isImageType($fileType)) {
//replace tmp image with re-sampled copy to exclude images with malicious data
$image = imagecreatefromstring(file_get_contents($filePath));
if ($image !== false) {
$img = imagecreatetruecolor($imageWidth, $imageHeight);
imagealphablending($img, false);
imagesavealpha($img, true);
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
switch ($fileType) {
case IMAGETYPE_GIF:
imagegif($img, $filePath);
break;
case IMAGETYPE_JPEG:
imagejpeg($img, $filePath, 100);
break;
case IMAGETYPE_PNG:
imagepng($img, $filePath);
break;
default:
return;
}
imagedestroy($img);
imagedestroy($image);
return null;
} else {
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid image.'));
}
}
}
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}
อัปเดต 23/06/17
ฟังก์ชันรุ่นที่ปรับปรุงนี้แก้ไข PNG และความโปร่งใสของ GIF
/**
* Validation callback for checking is file is image
*
* @param string $filePath Path to temporary uploaded file
* @return null
* @throws Mage_Core_Exception
*/
public function validate($filePath)
{
list($imageWidth, $imageHeight, $fileType) = getimagesize($filePath);
if ($fileType) {
if ($this->isImageType($fileType)) {
//replace tmp image with re-sampled copy to exclude images with malicious data
$image = imagecreatefromstring(file_get_contents($filePath));
if ($image !== false) {
$img = imagecreatetruecolor($imageWidth, $imageHeight);
switch ($fileType) {
case IMAGETYPE_GIF:
imagecolortransparent($img, imagecolorallocatealpha($img, 0, 0, 0, 127));
imagealphablending($img, false);
imagesavealpha($img, true);
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagegif($img, $filePath);
break;
case IMAGETYPE_JPEG:
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagejpeg($img, $filePath, 100);
break;
case IMAGETYPE_PNG:
imagealphablending($img, false);
imagesavealpha($img, true);
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagepng($img, $filePath);
break;
default:
return;
}
imagedestroy($img);
imagedestroy($image);
return null;
} else {
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid image.'));
}
}
}
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}