1

这是我的情况。用户登录到在线应用程序(JavaScript UI、PHP 后端)并请求报告。此报告包含仅应由用户看到的图像,因此它需要对其他用户不可见。不幸的是,我研究过的各种安全方法似乎并不适合我的需要。

首先,将图像放在文件夹中会使其对其他用户可见。随机化图像名称(假设用户无法获得目录列表)更好,但它并不适合我。但也许我只是偏执...

其次,将图像放在 Web 区域之外并使用服务器端脚本将其内容流式传输到数据 URI 效果很好,但旧版本的 IE(在 XP 上)无法处理大于 32KB 的数据 URI,并且这些图像可能更大比起那个来说。

第三,通过 IIS/htaccess 在文件夹中设置用户保护并将图像放在那里可以工作,但我已经通过具有行安全性的品牌登录页面设置了安全性。重新构建我的安全性比我想要的更混乱,我需要确保我可以为登录打上烙印。

我错过了任何选择吗?上述任何选项是否比我认为的更可行?

提前致谢!

4

1 回答 1

2

这就是解决这个问题的方法(你的第二个想法的变化)。

在我们的文档根目录之外创建一个名为images的目录。

在文档根目录中,创建一个名为image.php的文件,该文件将充当调度程序,首先检查用户是否具有权限,然后加载图像,否则抛出如下错误(示例):

<?php

// Start PHP Session
session_start();

// Get Request Param
$image_file = isset($_GET['file_name']) ? basename($_GET['file_name']) : '';

// Check if current user has permission here, e.g. using Session?
if ($_SESSION['can_view_image'])
{
    // Check If The Image File Exists
    if (file_exists('../images/'. $image_file))
    {
        // Get File Ext
        $file_ext = trim(end(explode('.', $image_file)));

        // Set Content Type Header Based On File Ext
        switch ($file_ext)
        {
            case 'jpg':
            case 'jpeg':
                header('Content-Type: image/jpeg');
                break;

            case 'png':
                header('Content-Type: image/png');
                break;
        }

        // Load Image
        readfile($image_file);
    }
    else
    {
        // Error
        exit('Requested image file does not exists on this server.');
    }
}
else
{
    // Error
    exit('You do not have permission to view this image');
}

?>

用法如下所示:

<img src="/image.php?file_name=some_important_chart.jpg" />

有权限的用户会看到图片,没有权限的用户会看到破损的图片。

于 2013-10-22T13:51:46.000 回答