我编写此代码来存储图像,并避免有人存储恶意软件或与图像不同的其他文件:
$content = file_get_contents($image);
file_put_contents($path, $content);
// Check imagesize to know if it is an image or not:
$sizeimage = getimagesize(dirname(__FILE__)."/".$path);
if($sizeimage[0]<10000){ echo "ok"; }else{ unlink(dirname(__FILE__)."/".$path); }
我尝试插入另一个文件,如CSS文件,并将CSS存储在数据库中。
为什么?我的代码出了什么问题?
答案 0 :(得分:2)
如果图片文件无效,$sizeimage[0]
会返回0
(检查PHP documentation)。
因此,如果文件没有有效图像,以下语句也会验证true
:
if($sizeimage[0]<10000)
考虑使用以下语句:
if($sizeimage[0]>0 && $sizeimage[0]<10000)
这只会在true
找到小于1000像素的图片时验证getimagesize()
。
答案 1 :(得分:2)
if($sizeimage[0]<10000){ echo "ok"; }else{ unlink(dirname(__FILE__)."/".$path); }
当文件不是图像时,getimagesize会返回false,但您不会检查该文件。您使用[0],但如果不存在,则变为“null”,小于10000.所以:
<?php
if($sizeimage !== false && isset($sizeimage[0]) && $sizeimage[0] < 10000 && $imagesize[0] > 0) {
echo "Okay.";
}
else {
unlink(dirname(__FILE__)."/".$path);
}
答案 2 :(得分:1)
getimagesize将在出错时返回false
。这意味着:
$sizeimage = false
$sizeimage[0] = null
null
转换为0
和0 < 10000
答案 3 :(得分:1)
请检查文件扩展名。如果它的无效扩展名则不允许。
if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg"))) { echo 'valid file'; }else { echo 'invalid file type';}
要删除文件,请使用PHP unlink()
答案 4 :(得分:0)
我修改了你的代码如下:
$content = file_get_contents($image);
file_put_contents($path,$content);
// Check imagesize to know if it is an image or not:
$sizeimage = getimagesize(dirname(__FILE__)."/".$path);
if($sizeimage){ echo "ok"; } else { unlink(dirname(__FILE__)."/".$path); }
这应该有效。当$ sizeimage为null或false时,将执行unlink。
有一种更好的方法可以通过检查文件的mime类型来确定文件是否是图像。请参阅 finfo_file (PHP 4)或 finfo (PHP 5)。