2

经过研究,我发现更建议将图像名称保存在数据库中,并将实际图像保存在文件目录中。少数几个原因中的两个是它更安全,图片加载速度更快。但是我并没有真正理解执行此过程的意义,因为每次我使用 firebug 工具检索图片时,我都可以在文件目录中找到可能导致潜在漏洞的图片路径。

我这样做是正确的还是不应该显示图像的完整文件目录路径?

用于将图像保存到数据库的 PHP

$images = retrieve_images();
    insert_images_into_database($images);

    function retrieve_images()
    {        
        $images = explode(',', $_GET['i']);

        return $images;
    }

    function insert_images_into_database($images)
    {
        if(!$images) //There were no images to return
            return false;        

       $pdo = get_database_connection();

        foreach($images as $image)
        {

            $path = Configuration::getUploadUrlPath('medium', 'target');
            $sql = "INSERT INTO `urlImage` (`image_name`) VALUES ( ? )";

            $prepared = $pdo->prepare($sql);
            $prepared->execute(array($image));
            echo ('<div><img src="'. $path . $image . '" /></div>');
        }
    }
4

3 回答 3

1

您可以使用 .htaccess 来保护您的图像。

看这里:

http://michael.theirwinfamily.net/articles/csshtml/protecting-images-using-php-and-htaccess

于 2012-07-24T02:16:42.120 回答
1

通过将图像存储在数据库中来实现您最初打算做的一种方法仍然是继续通过 PHP 脚本提供图像,因此:

  1. 使您的用户不知道图像的实际路径。
  2. 您可以并且应该将图像存储在您的外部DocumentRoot,以便 Web 服务器无法提供它们。

这是您可以通过以下方式实现的一种方法readfile()

<?php
// image.php

// Translating file_id to image path and filename
$path = getPathFromFileID($_GET['file_id']);
$image = getImageNameFromFileID($_GET['file_id']);

// Actual full path to the image file
// Hopefully outside of DocumentRoot
$file = $path.$image;

if (userHasPermission()) {
    readfile($file);
}
else {
    // Better if you are actually outputting an image instead of echoing text
    // So that the MIME type remains compatible
    echo "You do not have the permission to load the image";
}

exit;

然后,您可以使用标准 HTML 提供图像:

<img src="image.php?file_id=XXXXX"> 
于 2012-07-24T02:25:38.227 回答
0

我还在开发一个项目,该项目将图像的 url 路径存储在数据库 (Amazon RDS) 上,并将实际图像存储在 Amazon S3 的云管理文件系统中。

这样做的决定主要是出于对价格、可扩展性和易于实施的考虑。

更便宜:首先,与数据库(Amazon EC2 / RDS)相比,将数据存储在文件系统(Amazon S3)中更便宜。

可扩展性:由于图像存储库将来可能会变得非常大,您可能还需要确保您有足够的容量来为它们提供服务。在这一点上,与数据库相比,扩展文件系统更容易。事实上,如果您使用的是云存储(如 Amazon S3),您甚至不必担心没有足够的空间,因为它已由 Amazon 为您管理!你只需要为你使用的东西付费。

易于实施:在实施方面,将图像存储在文件系统中要容易得多。如果您要直接从数据库提供图像,您可能需要实现额外的逻辑来将 blob 文件转换为 html src blob 字符串以提供图像。从外观上看,这实际上可能会占用相当大的处理能力,这可能会减慢您的 Web 服务器的速度。

另一方面,如果您要使用文件系统,您只需将图像的 url 路径从数据库中放到图像的 src 属性中,一切就完成了!

安全性:至于图像的安全性,我已将图像名称更改为与随机字符串连接的时间戳,以便在不知道文件名的情况下浏览图片非常困难。

IE。1342772480UexbblEY7Xj3Q4VtZ.png

希望这可以帮助!

注意:如果您在这里发现任何问题,请编辑我的帖子!这只是我的意见,欢迎大家编辑!

于 2012-07-24T02:38:31.937 回答