【问题标题】:Images on my server inside a password protected directory我的服务器上受密码保护的目录中的图像
【发布时间】:2011-02-04 10:36:03
【问题描述】:

我在受密码保护的目录中有图片,但我想在正常的未受保护的网站上显示其中一些图片。

当我尝试用简单的方式显示它们时:

<img src ='PASSWORD PROTECTED DIR/Image.jpg">

它要求我输入用户名和密码。

但是,当我实际导航到受密码保护的目录中的内容时,我只想输入用户名和密码。

我正在使用 PHP。

有什么想法吗?

【问题讨论】:

  • 是否使用 PHP 无关紧要。服务器软件是什么?阿帕奇?
  • 在 Apache 的假设下重新标记。如果是其他服务器软件请更改

标签: apache .htaccess


【解决方案1】:

假设您使用的是 Apache。

您可以排除定义密码保护的.htaccess 文件中的一些文件。

未经测试,但这应该可以:

<Files "path/to/image.jpg"> 
  Allow from all
  Satisfy any
</Files>

但更可取的选择是将图像简单地放在受保护目录之外。

【讨论】:

    【解决方案2】:

    没有很多棘手的代码,这基本上是无法解决的。 &lt;img&gt; 命令表示您的用户将请求该信息,这与直接请求它没有太大区别。

    你可以开始检查请求是如何产生的,过滤,使所有图像通过 php 文件加载等等,但是使用基本工具是不可能的。

    直接请求图像或通过&lt;img&gt;标签请求图像是相同的。

    【讨论】:

      【解决方案3】:

      因为它是 PHP,你可以在一个单独的文件 (imgHandler.php) 中这样做

      <?php
      // Allowed files
      $allowedfiles["image1"] = "./the_dir/Image.jpg";
      $allowedfiles["image2"] = "./the_dir/Image2.jpg";
      
      function getImage($path) {
      
          echo file_get_contents($allowedfiles[$path]);
      }
      getImage($_REQUEST['img']);
      ?>
      

      然后对于您要显示的图像,只需使用:

      <img src="imgHandler.php?img=image1" />
      

      这不会阻止缓存,并且比我之前介绍的其他解决方案更安全。

      【讨论】:

      • 这根本不是一个好主意。它可以防止缓存,在 IE
      • 将我的答案编辑为更可取的解决方案,在 IE 中检查并正确缓​​存
      • 很公平,但就目前而言,这允许用户从受保护目录(或 PHP 具有读取权限的服务器上的任何其他文件)中获取 任何 资源,一个可怕的安全漏洞。它需要例如允许的文件数组
      • @Pekka:没错,将允许的文件保存在数组中是一个更安全的解决方案,我将添加它,并编辑当前函数以检查数组中的条目,所以用户找不到其他图像。
      • 为了解决安全问题,应该通过 cookie 或 url 中的 tken 来检查请求是否来自常规应用程序页面。所以没有安全问题,只是需要添加一些东西,这是防止直接访问文件的好方法,除非请求来自应用程序。无论如何,如果只有应用程序应该提供对图像的访问,则图片不应存储在 Web 目录根目录中,并且只能通过此处理程序访问。 (完美的解决方案也许应该检查一些标题以及 IE 问题)。
      猜你喜欢
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2010-10-24
      • 2017-08-14
      • 1970-01-01
      相关资源
      最近更新 更多