0

我有一个目录,其中包含在特定日期之前不应该在世界范围内访问的数据。

当然,该目录不应该通过网络浏览器直接在世界范围内可读。我目前用 .htpasswd 和 .htaccess 解决了这个问题。

但是,上一级目录有一个世界可读的 .php 文件。PHP 文件根据日期有条件地生成<img .../>从受保护目录中读取的基本 HTML 标记(例如 )。

不幸的是,在我的测试中,.php 文件需要身份验证才能加载数据。我的问题是我是否在尝试做一些根本不可能的事情,或者我是否可以对其进行调整以使其发挥作用。另外,如果可能的话,是否还有其他我应该知道的问题(安全或其他)?

附加信息:

  • 如果可能的话,我宁愿不使用 Javascript。
  • PHP 5.3 可用。
  • 关于解决方案的任何其他想法(我已经想到了一个 cron-job,我可能会这样做)?
4

2 回答 2

3

我猜您可能遇到的一个问题是,如果您尝试<img src="protected.jpg" />从不受保护的 php 文件中输出,您将能够显示 HTML,但不能显示图像文件本身。

如果我正确理解你想要做什么,你需要:

编辑:代理示例:我似乎无法在线找到示例,所以这是我希望控制从 PHP 对文件的访问时经常使用的功能(例如,这可能是需要从 $ 验证其访问权限的敏感数据_SESSION 或 DB 值):

function send_binary_data($path, $mimetype, $filename = null){

    @ob_clean();

    if($filename === null) $filename = basename($path);
    $size = filesize($path);

    //no-cache
    header('Cache-Control: no-cache, must-revalidate, public');
    header('Pragma: no-cache');

    //binary file
    header('Content-Transfer-Encoding: binary');

        //mimetype
    header('Content-Type: ' . $mimetype);
    header('Content-Length: ' . $size);
    header('Content-Disposition: inline; filename=' . $filename);
    header('Content-Description: ' . $filename);

    $chunksize = 1 * (1024 * 1024);
    $buffer = '';
    $handle = fopen($path, 'rb');

    if ($handle === false) {
        return false;
    }

    while (!feof($handle)) {
        $buffer = fread($handle, $chunksize);
        print $buffer;
    }

    $result = fclose($handle);
    unset($handle);
    $handle = null;

    die();

}   

当然,您仍然需要限制来自 .htaccess 的直接访问,但如果是代理,您会将所有请求重定向到不受保护的代理脚本,如下所示:

RewriteEngine ON
RewriteRule ^(.*)$ /proxy.php?file=$1 [NC,QSA]

proxy.php 将包含以下内容:

if(!isset($_GET['file'])) die('file not set');
$file = $_GET['file'];

//perform all your custom checking, including security checks due to retrieving data from $_GET, and if access is granted :

$path = 'yourpath/'.$file;
$mimetype = 'defineregardingyour/ownrules';
send_binary_data($path, $mimetype); 
于 2012-08-10T20:25:09.677 回答
1

.htaccess 仅用作直接从 Internet 到目录的访问控制。

PHP 访问由 chmod 权限控制。尝试将其更改为 755。您仍然可以使用 .htaccess 文件对其进行密码保护或任何其他类型的保护。

考虑到添加的注释,我假设您正在尝试在输出中包含受保护目录内的图像。自然,未经身份验证的用户无法访问它们……否则您为什么要保护它们?

您可以将需要全世界可访问的文件添加到您的 .htaccess 文件中。

于 2012-08-10T20:17:21.843 回答