Suy nghĩ của tôi về chủ đề rất đơn giản: tất cả ảnh tải lên đều là điều ác.
Và không chỉ vì chúng có thể chứa mã độc, mà đặc biệt là do thẻ meta. Tôi biết về các trình thu thập thông tin duyệt web để tìm một số hình ảnh được bảo vệ bằng thẻ meta ẩn của chúng và sau đó phát bằng bản quyền của chúng. Có lẽ một chút hoang tưởng, nhưng khi hình ảnh do người dùng tải lên nằm ngoài tầm kiểm soát đối với các vấn đề bản quyền, tôi xem xét nghiêm túc vấn đề này.
Để loại bỏ những vấn đề đó, tôi chuyển đổi có hệ thống tất cả hình ảnh đã tải lên thành png bằng gd. Điều này có rất nhiều ưu điểm: hình ảnh được xóa sạch từ các mã độc hại cuối cùng và thẻ meta, tôi chỉ có một định dạng cho tất cả hình ảnh đã tải lên, tôi có thể điều chỉnh kích thước hình ảnh cho phù hợp với tiêu chuẩn của mình và ... Tôi biết ngay nếu hình ảnh là hợp lệ hay không! Nếu không thể mở hình ảnh để chuyển đổi (sử dụng imagecreatefromstring không quan tâm đến định dạng hình ảnh), thì tôi xem hình ảnh là không hợp lệ.
Một thực hiện đơn giản có thể trông như thế này:
function imageUploaded($source, $target)
{
// check for image size (see @DaveRandom's comment)
$size = getimagesize($source);
if ($size === false) {
throw new Exception("{$source}: Invalid image.");
}
if ($size[0] > 2000 || $size[1] > 2000) {
throw new Exception("{$source}: Too large.");
}
// loads it and convert it to png
$sourceImg = @imagecreatefromstring(@file_get_contents($source));
if ($sourceImg === false) {
throw new Exception("{$source}: Invalid image.");
}
$width = imagesx($sourceImg);
$height = imagesy($sourceImg);
$targetImg = imagecreatetruecolor($width, $height);
imagecopy($targetImg, $sourceImg, 0, 0, 0, 0, $width, $height);
imagedestroy($sourceImg);
imagepng($targetImg, $target);
imagedestroy($targetImg);
}
Để kiểm tra nó:
header('Content-type: image/png');
imageUploaded('http://www.dogsdata.com/wp-content/uploads/2012/03/Companion-Yellow-dog.jpg', 'php://output');
này không chính xác trả lời câu hỏi của bạn như thế này là cùng một loại xe cho thuê hơn là câu trả lời được chấp nhận, nhưng tôi cung cấp cho bạn lý do để sử dụng nó, ít nhất :-)
Nguồn
2014-08-07 11:21:12
Theo như tôi biết, đây thực sự là lỗi được chấp nhận để thực hiện việc này. Tôi muốn được nghe những phương pháp tốt hơn nếu chúng tồn tại. –
Các tài liệu nói rằng nó trả về một mảng với 7 phần tử, yếu tố nào tôi cần phải kiểm tra xem nó có phải là hình ảnh hay không? –
số không và một cho chiều rộng và chiều cao. –