Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何为用户上传的图像提供服务?_Php_File Upload - Fatal编程技术网

Php 如何为用户上传的图像提供服务?

Php 如何为用户上传的图像提供服务?,php,file-upload,Php,File Upload,我正在构建一个小型web应用程序,允许登录用户上传产品图片。我正在尝试正确地构建它,在过去一些天真的实现之后,我决定将所有上传的内容添加到我的公用文件夹中 \app (public folder) -\index.php \includes \config \uploads 如果恶意用户试图上传一个PHP文件,服务器将无法访问或提供服务 也就是说,我将如何在网页上提供这些图片?最好的方法是什么?在过去,我使用了一个getImage.php文件,该文件将接受一个ID参数(以及一些生成值的散列,以

我正在构建一个小型web应用程序,允许登录用户上传产品图片。我正在尝试正确地构建它,在过去一些天真的实现之后,我决定将所有上传的内容添加到我的公用文件夹中

\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上)尝试防止恶意意图
我将使用引用webroot上面的目录。这样,您仍然可以使用图像链接,而无需打开上面完整的根目录进行曝光。

更“漂亮”的方法是使用
.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处理程序从中分离出来(以防止它们被执行),但所有其他我不太熟悉的东西:)