如何用php查看受保护文件夹中的图像?

时间:2014-02-08 15:20:45

标签: php

我的网站上有一个包含* .jpg文件的密码保护目录(带.htaccess)。我不希望任何人都可以直接访问这些.jpgs - 但我想允许php脚本显示* .jpg文件。有可能吗?


对于那些想知道我为什么要这个的人: 我有一个注册表单,用户可以上传图片,在完成注册之前,他可以检查是否上传了正确的图片。目前,我将上传的图片保存在一个临时目录中,如果他完成了,我将图片移动到受密码保护的目录。但是,我不喜欢在每次注册时,图片是公开的短时间段(例如通过搜索引擎)。更糟糕的是,当有人上传图片但没有完成注册时,图片将永远保留在临时目录中,除非我以某种方式删除。但是如果我在特定时间内设置了一个cron-job来删除临时目录中的所有图像,那么如果某个图片在不利的时刻注册,那么它将被删除。

3 个答案:

答案 0 :(得分:8)

h2ooooooo已经在评论部分回答了我的问题。

这是代码如何工作,在我的代码中我必须替换

<img src='link/to/protectet/picture.jpg'>

<img src='image.php'>

并且image.php仅由

组成
<?
header('Content-Type: image/jpeg');
readfile('link/to/protectet/picture.jpg');
?>

有效。感谢。

答案 1 :(得分:0)

我不确定,这是否是您想要实现的目标,但我理解:

  1. 有一组图片文件存储在.htaccess密码保护文件夹中,只有经过注册和验证的用户才能直接在该文件夹中下载文件。

  2. 对于新注册的用户,有一段时间,当上传图像的会话被允许下载图像时,但是不允许其他会话(无论是否经过身份验证)这样做。

  3. 为了做到这一点你可能会:

    1. 由于您需要区分临时图像和有效图像:将前者存储在/ temp文件夹中实际上是一个好主意,因为临时文件永远不会与有效文件混淆。

    2. 对于尝试注册的每个会话,您都可以使用session_id()(即$name = session_id() . '.jpg')为上传的图像文件命名。然后一个简单的脚本(类似于:php, file download)可以提供与当前会话相关的存储图像。此脚本可以是注册表单上<img>标记的源地址。

    3. 对于/ temp中的废弃图像 - 一个cron作业确实可以摆脱它们。通过为每个文件调用mtime() - 您可以轻松省略最近创建的文件 - 因此它们可能仍在使用中。

答案 2 :(得分:0)

h2ooooooo接受的答案很棒。但是,是什么阻止某人输入image.php的url地址并为图像提供服务呢? (事实上​​,这是我尝试过的,不幸的是,即使它在受密码保护的文件夹中,我也能够获取图像。)

似乎我们需要一种方法来确定请求来自同一网站上的页面,或者可能在此调用之前建立会话变量,并在提供图像之前检查其存在。对hereHow to check if a request if coming from the same server or different server?

有很好的建议

我最终做了以下事情(<img src="getUploadFile.php?fname=my.jpg">):

<?

function requestedByTheSameDomain() {
    $myDomain       = $_SERVER['SCRIPT_URI'];
    $requestsSource = $_SERVER['HTTP_REFERER'];

    return parse_url($myDomain, PHP_URL_HOST) === parse_url($requestsSource, PHP_URL_HOST);
}

if(requestedByTheSameDomain()) {
    $inputArr = array();
    if($_SERVER["REQUEST_METHOD"] == 'POST') {
        $inputArr   = $_POST; 
    }
    else {
        $inputArr   = $_GET; 
    }
    $fname = $inputArr['fname'];
    $path_info = pathinfo($fname);
    $ext = $path_info['extension'];

    if (in_array($ext, array('jpg','png','gif','jpeg','bmp','tif','tiff'))) {
        $type = 'image';
        $subType = $ext;
        if($ext == 'jpg') $subType = 'jpeg';
        if($ext == 'tif') $subType = 'tiff';
        if($ext == 'svg') $subType = 'svg+xml';
    }
    else if(in_array($ext, array('mpg','ogg'))) {
        $type = 'audio';
        $subType = $ext;
    }
    else if($ext == 'mp4'){
        $type = 'video';
        $subType = $ext;
    }
    else if($ext == 'pdf') {
        $type = 'application';
        $subType = $ext;
    }

    header("Content-Type: $type/$subType"); 
    readfile("images/$fname");
}   
?>

剩下的就是禁用右键单击和/或将其作为背景图像来渲染Save-Image-As。

相关问题