根据访问权限

时间:2018-06-02 23:22:10

标签: php image header

我正在尝试根据用户的访问级别显示img_a.png或img_b.png(例如登录或不登录)。当然,公众不应该获得内容(在这种情况下为img_a和img_b)。

我尝试了一些解决方案,但没有一个能帮助我,这就是我在这里寻求帮助的原因。我到目前为止尝试的是:

  1. 根据用户检查,我尝试将资源文件夹添加到" open_basedir"这是一个蹩脚的选择,但看起来最简单的解决方案。所有这一切都是通过它发出一个警告,资源不在它的基础文件夹中。

  2. 尝试将资源放在公用文件夹中,并通过.htaccess限制它们。但在这种情况下,他们不仅受到了不受欢迎的观众的限制,而且受到了所有人的限制。

  3. 最后和最接近的尝试是将图像放回到webroot之外,并编写一个验证访问权限的类,并提供如下图像:

    class Image {
    ...
    public function getImage() {
    ...
    header('Content-Type: '.$this->type);
    readfile($this->item);
    
  4. 之后通过以下内容显示在初始脚本中:

    echo "<img src=".$image->getImage($file).">";
    

    上面的问题是标题已经发送,所以我可以流式传输.php页面的图像或html输出,但不能同时输出。我有办法吗?

2 个答案:

答案 0 :(得分:1)

创建一个脚本,用于检查所需的任何用户属性,确定要提供的图像,以及读取/发送该图像。使用脚本URL作为<img src=...属性,即

<img src='/scripts/user_image.php'>

这样的东西适用于PNG图像。 GIF,JPG等也存在类似的功能。

<?php

    // do stuff here to determine file name of image to send
    if($_SESSION['userlevel']=="ADMIN"){
            $imageFilename="admin_image.png";
    }

    // Create Image From Existing File
    $image = imagecreatefrompng($imageFilename);
    //Set the Content Type
    header('Content-type: image/png');
    // Send Image to Browser
    imagepng($image);
    // Clear Memory
    imagedestroy($image);

    exit;

?>

好的,根据你的评论,我认为你引用的是错误的。

我的工作脚本与上面完全相同,只有if-then被注释掉了。我只是将文件名分配给变量。我已将脚本命名为user_image.php

引用图片的简单index.html文件 -

<html>
<head><title>test</title></head>
<body>

Hello World!<br />

<img src="user_image.php">

</body>
</html>

它只是工作。请参阅https://itsjustcrap.com/imghttps://itsjustcrap.com/img/src.zip

抓取来源

我会把它留下几天,但除了png图像和if-then之外的注释,源代码与此帖中的内容完全相同。

答案 1 :(得分:0)

实际上我觉得我找到了一个解决方案来解决我的问题。

将图像显示为如下数据:

<img src="data:image/png;base64, <?=base64_encode(file_get_contents($file))?>" alt="img">

而不是使用readfile()php脚本在源属性中提供它,如:

<img src="image.php?<?=$file?>" alt="my_image">

在html页面内,最后一个给我一个标题冲突。

在此发现了解决方案How to display Base64 images in HTML?