安全图像上传PHP

时间:2012-11-05 17:01:32

标签: php image security file-upload gd

  

可能重复:
  Security threats with uploads

我一直在寻找安全图像上传的好脚本/教程,但无论我发现什么,在安全性方面,阅读评论似乎都存在问题。所以我试着编写我的脚本。我想就此提出任何安全建议。

//create arrays from allowed extensions and types
$allowed_exts = array("jpg", "jpeg", "png", "gif");
$allowed_types = array("image/jpeg", "image/png", "image/gif");

//extract extension from uploaded file
$ext = strtolower(substr($_FILES["image"]["name"], strrpos($_FILES["image"]["name"], ".") + 1));

我首先检查扩展名是否是允许的

之一
 if(in_array($ext, $allowed_exts) === false){
    echo "Only .jpg, .png, .gif allowed";
    }

然后检查类型是否是允许的

之一
 elseif(in_array($_FILES["image"]["type"], $allowed_types) === false){
    echo "Only .jpg, .png, .gif allowed";
    }

然后检查文件大小

elseif($_FILES["image"]["size"] > 2100000){
    echo "File is too big";
}

现在使用getimagesize检查尺寸

   elseif(!getimagesize($_FILES["image"]["tmp_name"])){ 
    echo "File is not an image";
    } else {

我创建一个随机文件名

$filename = mt_rand(1000,99999)."_".$_POST['p_id'].".jpg";

如果这一切都很好,我用GD创建一个拇指。简而言之(包括它的jpeg):

a. imagecreatefromjpeg -> from uploaded file
b. imagecreatetruecolor -> with desired thumbnail dimensions
c. imagecopyresampled -> modify the image created under a.
d. imagejpeg -> save image to destination

所以,正如我所读到的,这应该可以消除图像带来的大多数问题,但我确信我错过了一些重要的事情。

我写文件的目录有755权限,但我想我必须通过在文件夹中放一个.htaccess来对目录进行更多限制?那应该是什么?

1 个答案:

答案 0 :(得分:0)

我一段时间做了一个字符串清理脚本,我认为这可能会有所帮助。记得清理所有$ _POST项目,如下所示:

//CLEAN-UP FUNCTIONS
function ms($v) {
     $v = str_replace("<br />","",$v); 
     $v = str_replace(" ","-",$v); 

     // Replace UTF-8 characters.
     $v = str_replace(
        array("\xe2\x80\x98", "\xe2\x80\x99", "\xe2\x80\x9c", "\xe2\x80\x9d", "\xe2\x80\x93", "\xe2\x80\x94", "\xe2\x80\xa6"),
        array("'", "'", '"', '"', '-', '--', '...'),$v);

     // Replace their Windows-1252 equivalents.
     $v = str_replace(
        array(chr(145), chr(146), chr(147), chr(148), chr(150), chr(151), chr(133)),
        array("'", "'", '"', '"', '-', '--', '...'),$v);
     // Finalize                    
     $v = htmlspecialchars($v, ENT_QUOTES);
     //$v = nl2br($v);
     return $v;
}

用法:

$id = ms($_POST['p_id']);