使用HTTP_REFERER的安全性问题

时间:2013-11-14 13:20:47

标签: php .htaccess

我有一个网页(“research.php”),其中包含PDF文件的链接,并希望在任何人看到文件之前显示免责声明(“disclaimer.html”)。目前,我已经通过检查HTTP_Referrer的值并重定向(如果它不是来自免责声明页面)来完成此操作。

代码:

$ref = $_SERVER['HTTP_REFERER'];

if($ref !== 'http://my.site.com/disclaimer.html') {
  die('<META HTTP-EQUIV="Refresh" CONTENT="0;URL=disclaimer.html">');}

研究页面包含PDF文件的链接,这些文件保存在一个单独的目录中,该目录仅限于使用.htaccess进行本地访问。 PDF由PHP脚本(“download.php”)提供,该脚本也检查HTTP_Referrer。

据我所知,HTTP_Referrer变量可能会被欺骗,导致此方法不安全,并且有几个问题:

首先,是否有人可以直接从其他网站链接到研究页面或下载脚本,并欺骗HTTP_Referrer,以便他们的访问者可以绕过免责声明?基于different question,我的理解是HTTP_Referrer很容易在个人电脑上被欺骗,但对于网站访问者来说这很难做到吗?

其次,有没有办法让download.php脚本更安全,例如将它放在限制为使用.htaccess进行本地访问的目录中?我目前正在使用“a href =”download.php?...“形式的简单链接调用脚本,所以我的理解是这不起作用 - 这是正确的吗?

任何评论都表示赞赏。最重要的是,我希望很难/不可能链接到来自其他网站的页面或文件而不显示免责声明或没有该网站的所有者实际将PDF存储在他们的网站上。毫无疑问,任何解决方案都会有某些漏洞,但我想要了解的是,对于有经验的网页设计师来说,绕过免责声明网页是多么棘手。

更新: jszobody在下面的回答清楚地概述了一个更好的方法,所以回答了这个问题 - 但我仍然有兴趣知道,如果有人能够简单地解释它,从第三方网站上的链接欺骗HTTP_REFERRER涉及多少工作。

1 个答案:

答案 0 :(得分:3)

我会考虑使用会话。

在disclaimer.php上:

session_start();
$_SESSION['viewed_disclaimer'] = true;

关于research.php:

session_start();
if(!$_SESSION['viewed_disclaimer']) {
    header("Location: disclaimer.php");
    die();
}

你明白了。您也可以通过不直接链接到它们来保护单个PDF文件,而是使用PHP passthrough脚本。

将其命名为download.php:

session_start();
if(!$_SESSION['viewed_disclaimer']) {
    header("Location: disclaimer.php");
    die();
}

$filename = basename($_GET['filename']);
if(file_exists("path/to/my/pdfs/" . $filename) { 
    // Send headers for a PDF file, and read out the file
}

然后,您可以从research.php链接到download.php?filename=myfile.pdf

有意义吗?