【问题标题】:How to view images from protected folder with php?如何使用 php 查看受保护文件夹中的图像?
【发布时间】:2014-02-08 15:20:45
【问题描述】:

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


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

【问题讨论】:

  • 您可以使用 robots.txt 来屏蔽该目录中的爬虫。您可能想检查深度链接,可能会对您有所帮助。
  • PHP 不关心您的htaccess 配置,除非您尝试从其他服务器获取文件,否则它将直接联系文件系统。
  • @h2ooooooo 如果我包含图片,则提示用户输入受保护目录的用户名和密码。所以php。关心我的 htaccess,还是我错过了你的意思?
  • 你的php文件在受保护的文件夹里吗??
  • @Adam 你如何“包括图片”?正确的方法是喷出一个图像标题并使用readfile() 显示它。你只是打印出<img src="" />吗?如果是这样,它与PHP无关。浏览器读取img标签,自动请求图片。

标签: php


【解决方案1】:

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

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

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

<img src='image.php'>

而 image.php 仅包含

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

那行得通。谢谢。

【讨论】:

    【解决方案2】:

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

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

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

    为此,您可能可以:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      我最终做了以下事情 (&lt;img src="getUploadFile.php?fname=my.jpg"&gt;):

      <?
      
      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 变得困难。

      【讨论】:

      • 你是对的,应该考虑如何防止其他人也获得图像,但这不在OP的范围内。
      猜你喜欢
      • 2014-01-22
      • 2015-07-30
      • 2014-12-24
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2016-03-03
      相关资源
      最近更新 更多