Php 如何为用户上传的图像提供服务?
我正在构建一个小型web应用程序,允许登录用户上传产品图片。我正在尝试正确地构建它,在过去一些天真的实现之后,我决定将所有上传的内容添加到我的公用文件夹中Php 如何为用户上传的图像提供服务?,php,file-upload,Php,File Upload,我正在构建一个小型web应用程序,允许登录用户上传产品图片。我正在尝试正确地构建它,在过去一些天真的实现之后,我决定将所有上传的内容添加到我的公用文件夹中 \app (public folder) -\index.php \includes \config \uploads 如果恶意用户试图上传一个PHP文件,服务器将无法访问或提供服务 也就是说,我将如何在网页上提供这些图片?最好的方法是什么?在过去,我使用了一个getImage.php文件,该文件将接受一个ID参数(以及一些生成值的散列,以
\app (public folder)
-\index.php
\includes
\config
\uploads
如果恶意用户试图上传一个PHP文件,服务器将无法访问或提供服务
也就是说,我将如何在网页上提供这些图片?最好的方法是什么?在过去,我使用了一个getImage.php文件,该文件将接受一个ID参数(以及一些生成值的散列,以避免用户猜测ID),看起来像“getImage.php?ID=555&c=44j54k3h5”。服务器获取数据库(真实路径)中的图像信息,加载内容,重建头部,然后发送图像
这种方法是否存在安全问题?有没有办法让它更漂亮?使用htaccess重写规则查找/images/imagename.jpg并将其发送到我的getImage.php文件会增加安全漏洞吗?任何关于最佳实践的建议都将不胜感激。请查看本课程。它将处理上传、进行安全检查并为您煮咖啡:)
您为上传图像提供服务的方法的安全性确实取决于许多其他因素
- 上传时如何处理和保护图像/文件?有什么问题 上载的目录/文件权限李>
- 哪些进程可以读取和写入这些位置李>
- 您有什么类型的文件处理程序可以执行任意文件李>
- 如果您使用PHP->get_image->display_image路由,它是否会在上传后(在getimage上)尝试防止恶意意图
.htaccess
重定向
RewriteEngine On
RewriteBase /
RewriteRule ^getImage/([0-9]+)/(.+)\.png$ getImage.php?id=$1&c=$2 [NC,L]
然后在getImage.php中
if (isset($_GET['id']) && isset($_GET['c'])) {
// set headers
header("Content-Type: image/png");
// cache control
header("Cache-Control: private, max-age=10800, pre-check=10800");
header("Pragma: private");
header("Expires: " . date(DATE_RFC822, strtotime("2 day")));
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
header('Last-Modified: ' . $_SERVER['HTTP_IF_MODIFIED_SINCE'], true, 304);
exit;
}
/* do things */
imagepng($image_resource);
imagedestroy($image_resource);
}
else {
echo "bad request";
}
所以不是
site.com/getImage.php?id=555&c=44j54k3h5
你会用
site.com/getImage/555/44j54k3h5.png
这种方法没有任何附加的安全风险或漏洞。只需确保在查询之前转义get变量,以避免注入攻击
如果你想保护自己不受恶意文件上传的影响,你需要在提供服务之前这样做。你在上传文件时对其进行什么类型的安全检查?我还没有建立它,我想确保我没有忽视一些重大的第一步。我将检查扩展,然后使用getimagesize()查找它们的尺寸,以确保它们是图像,因为这似乎是一种常见的方法。。。这就足够了吗?getimagesize()
速度相当慢,而且检查文件扩展名也不是万无一失的。我使用一个图像上传类来检查大量不同的内容,以确保文件不是恶意的。让我看看能不能找到……谢谢,这些都是我要调查的事情。我计划在uploads文件夹中添加一个htaccess文件,将所有php处理程序从中分离出来(以防止它们被执行),但所有其他我不太熟悉的东西:)