使用PHP从public_html外部读取图像?

时间:2011-12-30 04:24:07

标签: php permissions cpanel directory

这真的很愚蠢,但我一直在尝试几十种不同的事情而且我不能为我的生活弄清楚我做错了什么。

我有一个cpanel安装,使用通常的public_html目录并访问下面的目录(调用该目录“USER”)。我正在用图像测试一些东西。

我已将一个图像文件放在public_html上面的USER目录中。

我写了一个测试PHP脚本,它只有几行:

if(is_file("../1.jpg")){    
    echo "<img src=\"../1.jpg\" />";
}else{
    echo "not there";
}

is_file总能找到该文件。还尝试了file_exists和is_readable,这些都可以找到文件。

但即使脚本看到该文件,我也无法知道如何将该文件输出到浏览器。或者即使可以这样做也可以。

我已将文件的权限更改为可读。

我尝试过从根开始的绝对路径。

我尝试使用imagejpeg。

这些都不起作用。

您可能想知道我为什么不将图像放在public_html中,但是这个脚本是我正在做的测试因为我需要弄清楚在提供来自其他域/帐户的图像时可能出现的问题。相同的服务器(它是专用服务器)。

我可以理解,这可能是权限或其他东西 - 在这种情况下我不明白为什么脚本可以找到文件 - 好吧无论如何我可能忽略了一些非常愚蠢或基本的东西。所以如果有人能指出我正确的方向,我会很感激。

非常感谢

1 个答案:

答案 0 :(得分:11)

无法做到。当您输出img标签时,这只是服务器上的一些文本。它被发送到浏览器,浏览器试图获取src="..."部分中列出的文件。这是通过HTTP请求完成的,因此如果图像位于文档根目录之外,则无法根据定义直接获取文件。

如果您只需执行src="../../../../picture.jpg"并获取文档根目录之外的图像,则可以在服务器上获取任何文件,包括您的配置文件,密码文件,等等等等。这个安全漏洞足以让人觉得疯了。

如果要提供对文档根目录之外的文件的访问权限,则必须通过脚本执行此操作。最简单的方法是:

image.php:

<?php
header('Content-type: image/jpeg');
readfile('/path/to/picture/outside/doc/root/file.jpg');

并在你的HTML中:

<img src="image.php">

还有其他更糟糕的选择,例如使用Apache别名指令将外部目录映射到“内部”目录,重写URL等等......但这只会让事情变得更加复杂。