【问题标题】:PHP where to save user uploaded image files [closed]PHP在哪里保存用户上传的图像文件[关闭]
【发布时间】:2012-09-27 11:46:45
【问题描述】:

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

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

但是,这是不好的做法吗?为什么存储在文档根目录中不好?哪里可以更好地存储文件?

i 过滤扩展如下:

    // 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;
}

【问题讨论】:

  • 练习安全上传是不错的做法。但是,如果您的文件验证错误/不存在,则将用户上传的文件放入可公开访问的目录可能会导致您的服务器完全受损,或者您的服务器成为恶意软件源。因此,如果您是安全摇滚明星,请放心。否则,将它们填充到文档根目录之外并提供其他访问方式。
  • @Marc B 谢谢你的回复,我不认为我是一个安全摇滚明星,你能解释一下你在文档根目录之外的意思吗?您所说的提供其他访问方式是什么意思?

标签: php image upload store document-root


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复,我将文件名、类别、用户名和图像名存储在数据库中,并且我的图像文件位于如上所示的目录中,是的,所有这些图像都是公开显示的
【解决方案2】:

与某些人认为的不良做法相反,位置本身不是问题;但你必须注意一些事情:

  • 按扩展过滤;仅接受几种图像格式(.jpg、.gif、.png)并拒绝其余的;绝对不接受 .php 扩展名

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

  • 重要 - 确保图像不是由 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 标头;如果不存在,您应该是安全的。

【讨论】:

  • 感谢您的回复,如果我添加显示我如何过滤扩展的代码,您能帮我检查一下吗?我将它添加到问题中,我将如何打开expose_php?
  • @neeko 你不应该相信浏览器发送给你的 mime 类型。更新了答案。
  • 我已经检查了我的 php.ini 文件和expose_php = on,如何检查 x-power-by 标头?你也能给我一个过滤扩展的好方法的代码示例,谢谢你的帮助!
  • @neeko 使用浏览器的调试工具;如果不确定,请搜索 Firebug。
  • 再次谢谢你,我仍然不确定如何检查响应头,我有萤火虫?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
相关资源
最近更新 更多