【问题标题】:Block Direct Access to Dynamic PHP-Image阻止直接访问动态 PHP 图像
【发布时间】:2011-05-11 19:41:45
【问题描述】:

我有一个名为 test.php 的 PHP 页面,我在该页面上链接到一个名为 image.php 的动态图像,如下所示:

echo "<img src=\"image.php?ID=abc&X=123\" align=\"absmiddle\" style=\"margin:5px;\"><br>";

图像文件将IDX 作为GET 参数,并使用它们来include 我服务器中的现有静态图像。发送标头告诉服务器将文件解释为 jpeg。

我想阻止用户通过访问http://mydomain.com/image.php?ID=/abc&amp;X=123 拉取图像,同时允许在test.php 和我服务器上的其他页面中查看该图像。我该如何做到这一点?

到目前为止,我已经尝试了多种.htaccess 修改和重写,其中与我的担忧最相关的是the one shown on this page。没有任何效果;请帮忙!

【问题讨论】:

  • 感谢大家的意见。虽然您的回答为我指明了正确的方向,但此页面上的解决方案正是我所需要的:bit.ly/fN2RSN

标签: php html image apache .htaccess


【解决方案1】:

I) 使用会话:

test.php:

<?php
session_start();
//....
$_SESSION["allow_images"]="yes";
echo "<img src=\"image.php?ID=abc&X=123\" align=\"absmiddle\" style=\"margin:5px;\"><br>";
?>

image.php:

<?php
session_start();

if(isset($_SESSION["allow_images"]) { 
  // render image
  unset($_SESSION["allow_images"]);
} else {
  // throw error/ show dummy image /etc
}
?>

II) 第二种解决方案(并非万无一失):

里面的image.php

$ref=$_SERVER["HTTP_REFERER"]; 
if($ref == "http://yoursite.com/path/test.php") {  
   // get image parameters and render image
} else {
   // throw error or maybe render a dummy image with just few bytes
};

请注意,HTTP_REFERER 很容易被欺骗。


之前的错误解决方案:

在 test.php 中使用变量

$allow_image="yes";
echo "<img src=\"image.php?ID=abc&X=123\" align=\"absmiddle\" style=\"margin:5px;\"><br>";

并在渲染之前在 image.php 中测试 isset($allow_images)。仅当 romanusfatuus 指出的包含 image.php 时才会起作用。

【讨论】:

  • 这只有在我将include 图像转换为test.php 时才有效,使其能够访问包含的代码。不幸的是,据我所知,image.php 无法以我希望引用的方式看到甚至确定 $allow_image_access 的存在。
  • 抱歉,变量似乎只有在您“包含”文件时才有效。但是这些方面的东西应该可以工作。
  • 是的。 HTTP_REFERER 是另一种方式,虽然这不是万无一失的。
  • 除非黑客入侵了您的服务器,否则使用 SESSION 变量的解决方案是安全的——普通用户无法欺骗它们。 (请参阅此讨论webhostingtalk.com/archive/index.php/t-290980.html)。
  • @JP19L SESSION 变量是安全的,但对于这个解决方案并不实用
【解决方案2】:

这是不可能的,因为您的浏览器显示图像的操作是直接访问

会有很多关于分析HTTP_REFERER 的建议,但这将是一个糟糕的决定,因为此标头是可选的,并且在某些情况下它可以被防火墙、防病毒、代理等切断。

【讨论】:

  • @romanusfatuus:它不能解决我在回答中描述的问题。那里没什么有趣的。您能做的最好的事情就是检查(在.htaccess 中,当然,不在 php 中)referer 是否存在并且等于当前域,或者根本不存在。我认为这是一个很好的折衷方案。
  • 非常感谢!我将纳入该措施。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
相关资源
最近更新 更多