CẬP NHẬT 13/07/2017 [VẤN ĐỀ CỐ ĐỊNH]
Nhóm Magento đã phát hành SUPEE-9767 V2 trong phiên bản vá lỗi này với lỗi gif trong suốt và png đã được sửa.
Bạn nên hoàn nguyên tất cả các thay đổi đối với tệp đã được thảo luận trong chuỗi này. Sau đó hoàn nguyên bản vá V1 được áp dụng và cuối cùng áp dụng phiên bản mới V2.
TRƯỚC - SUPEE-9767 V2
Vui lòng không sử dụng mã được thảo luận dưới đây thay vào đó áp dụng V2 của bản vá, vấn đề được thảo luận dưới đây đã được khắc phục trong phiên bản này
Nếu ai đó gặp sự cố với png trong suốt mà khi tải lên từ bảng quản trị, nền sẽ chuyển sang màu đen. (Trên các sản phẩm) liên quan đến cuộc gọi lại Tải lên hình ảnh được giới thiệu trong:
app/code/core/Mage/Adminhtml/controllers/Catalog/Product/GalleryController.php
Hiện tại tôi không chắc chính xác điều gì gây ra hành vi này nhưng tôi đang cố gắng tìm ra tôi có thể xác nhận rằng khi cuộc gọi lại bị xóa, hành vi lạ sẽ biến mất.
CẬP NHẬT
Ok, tôi đã tìm thấy chức năng cũng được cập nhật từ SUPEE-9767, điều này thực sự phá vỡ tính minh bạch trong png, một bản sao của hình ảnh gốc được tạo ra mà không trong suốt.
+++ 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.'));
CẬP NHẬT
Đây là phiên bản cập nhật của chức năng để duy trì tính minh bạch của png
imagealphablending($img, false);
imagesavealpha($img, true);
hai dòng này cần được thêm vào bản vá. Cập nhật chức năng trongapp/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.'));
}
CẬP NHẬT 23/06/17
Phiên bản cập nhật này của chức năng sửa lỗi trong suốt PNG và 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.'));
}