目前我正在保存用户上传的图像文件,如下所示:
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;
}
答案 0 :(得分: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_php
为On
(您可以从phpinfo()
页面查看。然后下载图像使用浏览器检查响应标头并检查是否看到X-Powered-By
标题;如果不存在,则应该是安全的。
答案 1 :(得分:1)
更好可以在文档根目录中保持公开可见的图像。但只存储您想要显示的图像。不是另一个。并确保这些是图像文件,因为some gotchas。
我有一个用户存储图像的网站。但我将文件名,类别,用户名,图像名称保存到数据库中,并将图像文件保存在单个目录中。