安全图像上传PHP
可能重复: 我一直在寻找一个很好的脚本/教程来实现安全的图像上传,但是无论我找到什么,阅读评论都会发现脚本在安全性方面存在问题。所以我试着写我的剧本。我想问一下这方面的安全建议安全图像上传PHP,php,image,security,file-upload,gd,Php,Image,Security,File Upload,Gd,可能重复: 我一直在寻找一个很好的脚本/教程来实现安全的图像上传,但是无论我找到什么,阅读评论都会发现脚本在安全性方面存在问题。所以我试着写我的剧本。我想问一下这方面的安全建议 //create arrays from allowed extensions and types $allowed_exts = array("jpg", "jpeg", "png", "gif"); $allowed_types = array("image/jpeg", "image/png", "image/g
//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";
}
然后检查类型是否为允许的类型之一
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来对目录进行更多限制?里面应该有什么?不久前我制作了一个字符串清理脚本,我想它可能会有所帮助。请记住清理所有的$\u 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;
}
我读过很多这样的帖子,但没有一篇能给我一个关于如何让用户安全上传图片的结论性答案。