2012-10-06 159 views
1

目前我保存用户上传的图像文件如下:PHP在哪里保存用户上传的图像文件

public_html/img/user/$category/$username/$imagename 
然而

,这是不好的做法?为什么存储在文档根目录下以及存储文件的更好位置在哪里?

我筛选器扩展如下:

// Check to see if the type of file uploaded is a valid image type 
function is_valid_type($file) 
{ 
    // This is an array that holds all the valid image MIME types 
    $valid_types = array("image/jpg", "image/JPG", "image/jpeg", "image/bmp", "image/gif", "image/png"); 

    if (in_array($file['type'], $valid_types)) 
     return 1; 
    return 0; 
} 
+2

如果你练习安全的上传,这不是不好的行为。但是,如果您的文件验证不正确或不存在,则将用户上传的文件放入可公开访问的目录可能会导致您的服务器被彻底破坏,或者您的服务器成为恶意软件源。所以如果你是一位安全摇滚明星,那么请随意。否则,将它们填充到文档根目录之外并提供其他访问方式。 –

+0

@Marc B谢谢你的回复,我不认为我是一个安全的摇滚明星,你能解释一下你在文档根目录之外的意思吗?以及您提供其他访问方式的含义? – neeko

回答

2

与一些人认为是不好的做法相反,位置本身不是问题;但你必须照顾几件事:

  • 按扩展名筛选;只接受几种图像格式(.jpg,.gif,.png)并拒绝其余的;绝对不接受.php扩展名

  • 不要相信浏览器发送的MIME类型,以确定图像是否有效。使用getimagesize()自己做;通过在图像中隐藏PHP脚本,这可以是fooled,但这就是为什么我们有一个更重要的步骤。

  • 重要 - 确保图像不与PHP引擎一起提供;一些图像可以制作成看起来像图像但隐藏脚本的方式。为此,请使用Web服务器的配置。

  • Other issues you need to be aware about when you're handling uploads

参见:Secure User Image Upload Capabilities in PHP

顺便说一下,以测试PHP引擎没有被用来为图像,确保expose_phpOn(你可以从phpinfo()告诉然后使用浏览器下载图片,检查响应标题,并检查是否看到X-Powered-By标题;如果不在那里,应该是安全的。

+0

谢谢你的回复,如果我添加我的代码显示如何过滤扩展可以检查它吗?我将它添加到这个问题,我怎么会把expose_php打开? – neeko

+1

@neeko你不应该相信浏览器发送给你的MIME类型。更新了答案。 –

+0

我检查了我的php.ini文件和expose_php = on,如何检查x-power-by标题?也可以给我一个很好的方式来筛选扩展的代码示例,谢谢你的帮助! – neeko

1

更好保持公开可见的图像文档根目录。但只存储您想要显示的图像。不是另一个。并确保这些图像文件是some gotchas

我有一个网站,用户存储图像。但是我将文件名,类别,用户名,图像名称保存到数据库中,并将图像文件保存在单个目录中。

+0

谢谢你的回复,我将文件名,类别,用户名和图像名称存储在数据库中,我的图像文件位于上面显示的目录中,并且是所有这些图像都公开显示 – neeko

+0

上传验证图像文件 –

相关问题