显示来自Web根目录外部的图像不起作用?

时间:2016-11-03 05:50:09

标签: php html security

我正在尝试显示存储在Web根目录之外的用户图像(出于安全目的)。我已经尝试了提出here的建议但是当我导航到show_imgs.php时,我的浏览器返回了一堆乱码符号,似乎进入了一个无限循环。

我的代码与示例的唯一不同之处在于我的代码处于循环中。不确定这是否与它有关。

我的代码:

$image_array = ["img_1.png", "img_2.png", "img_3.png"];

$i = 1;
foreach($image_array as $image) {

    //Specify absolute path
    $image_path = "/absolute/path/to/img_$i.png";

    //Get file contents. I have also tried readfile() in place of this.
    $contents = file_get_contents($image_path);

    //Perhaps this is causing the infinite loop?
    header('Content-type: image/png');

    //Display contents of file (aka the image)
    echo $contents;

    $i++;
}

当然,在使用file_get_contents进行安全性之前,我会想要添加文件大小和mime类型验证(如果有更多安全检查我应该这样做,请说明。)

1 个答案:

答案 0 :(得分:0)

您无法循环播放多张图片。一个php文件将输出一个标题和一个图像。你必须再次打电话才能获得另一张图片。

"通过这种方式,您可以调用如下图像:"

/image.php?file=myfile.jpg

其中images.php是包含标题和图像的php文件。

<强> images.php:

$file = basename(urldecode($_GET['file']));
$fileDir = '/path/to/files/';

if (file_exists($fileDir . $file)) {
    // Note: You should probably do some more checks 
    // on the filetype, size, etc.
    $contents = file_get_contents($fileDir . $file);

    // Note: You should probably implement some kind 
    // of check on filetype
    header('Content-type: image/jpeg');

    echo $contents;
}

<强> my.html:

<img src="images.php?file=myimage.jpg" alt="">