1

我有一个网页(“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,以便他们的访问者能够绕过免责声明?基于一个不同的问题,我的理解是 HTTP_Referrer 很容易在个人的 PC 上被欺骗,但对于网站访问者来说更难做到这一点?

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

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

更新:jszobody 下面的回复清楚地概述了这样做的更好方法,因此回答了这个问题 - 但如果有人可以简单地解释一下,我仍然想知道从 3rd 方网站上的链接欺骗 HTTP_REFERRER 涉及多少工作.

4

1 回答 1

3

我会考虑为此使用会话。

在 disclaimer.php 上:

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

在 research.php 上:

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

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

称它为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
}

然后您可以链接到download.php?filename=myfile.pdf来自 research.php。

有道理?

于 2013-11-14T13:23:13.153 回答