1

PHP 新手在这里,疯狂地挣扎着想知道如何在我可悲的无能下载系统中实现基于 HTTP_REFERER 的安全功能。

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

?thanks

如果这在 URL 中可见,则用户将能够下载位于其上的文件。它工作得很好,但很容易通过简单地将“?谢谢”部分添加到 URL 本身来“解锁”页面。有效地允许用户绕过我笨拙的安全性并轻松访问我的高级文件。

如果可能的话,我想添加一个安全措施,让任何试图访问包含字符串“?谢谢”的页面的人都被重定向到主页。这将为我提供完美的解决方案。

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

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

啰嗦,是的,但对于我不寻常的要求来说,这将是非常理想的。我也知道用户可以通过首先在 URL 中附加“?pending”然后附加“?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.';
}
4

2 回答 2

2

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

您需要的是实际的服务器端状态。为用户打开一个会话,为他正在经历的进程提供一些随机的唯一 id,该 id 在进程中的每个页面上携带,并保存进度和接下来在会话中显示的消息。

于 2013-04-05T10:00:13.003 回答
1

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

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

于 2013-04-05T10:03:30.737 回答