HTTP_REFERER困境:只有当访问者事先访问过另一个特定页面时,我才能允许访问特定页面?

时间:2013-04-05 09:46:21

标签: php download

PHP新手在这里疯狂地挣扎着如何在我糟糕的下载系统中实现基于HTTP_REFERER的安全功能。

基本上,我有它的文件下载页面有一个特定的字符串附加到URL的末尾,这个特定的字符串是:

?thanks

如果在URL中可以看到,那么用户将能够下载位于其上的文件。它运作良好,但很容易解锁'一个页面,只需添加'?thanks'部分到URL本身。有效地允许用户绕过我笨拙的安全性并轻松访问我的高级文件。

如果可能的话,我想添加一项安全措施,让任何人试图访问包含字符串的页面'?thanks'以前没有从包含'?待定'的页面到达被重定向到主页。这将为我提供完美的解决方案。

为了清楚起见,典型的预下载过程如下:

  • 用户访问下载页面:[网站] / download / page / 123 /
  • 用户完成Recaptcha,被重定向到这里:[website] / download / page / 123 /?pending
  • 用户填写详细信息,重定向到此处:[website] / download / page / 123 /?thanks
  • 用户收到他们的文件

啰嗦,是的,但对于我不寻常的要求来说,这将是非常理想的。我也知道用户可以通过首先附加'待定'来解决这个问题。到网址然后附加'?感谢'之后,但它仍然真的,真的会有所帮助。

那么,StackOverflow,你们中的任何一个人都能干瘪,善良的程序员可以帮助一个初出茅庐的网页设计师吗?我感谢你的帮助。干杯。

编辑:哦,这是一个失败的方法,最后一次尝试但遭到可怕的轰炸,以防它有助于进一步说明我的目标:

if (('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] == wp_get_shortlink().'?thanks') && (isset($_SERVER['HTTP_REFERER']) && preg_match("/".preg_quote('?pending',"/")."/i",$_SERVER['HTTP_REFERER']))) {
    echo 'Hurrah!';
} else {
    echo 'Oh dear.';
}

2 个答案:

答案 0 :(得分:2)

如果这一切只取决于请求本身中的信息,则无法强制执行您要执行的操作。引用者也只是一个任意的请求头

您需要的是实际的服务器端状态。为用户打开一个会话,给出他正在浏览过程中每个页面的随机唯一ID的过程,并保存会话中接下来显示的进度和消息。

答案 1 :(得分:1)

没有像“基于HTTP_REFERER的安全性”这样的东西。这是矛盾的。

为了安全起见,您必须使用SESSION。在您的特定情况下,它似乎也是最合适的:只需在会话中存储访问任何页面的事实,然后在其他任何页面上检查该值