这里是一个PHP新手,疯狂地想弄清楚如何在我糟糕的下载系统中实现基于http_referer的安全特性。
基本上,我的文件下载页面有一个特定字符串附加到URL的末尾,这个特定字符串是:
?thanks
如果在URL中可见,则用户将能够下载位于其上的文件。它工作得很好,但很容易"解锁"一个页面,只需添加"?"感谢部分的URL本身。有效地让用户绕过我笨拙的安全措施,轻松访问我的高级文件。
如果可能的话,我想添加一个安全措施,任何人试图访问包含字符串'?"谢谢"之前没有从包含"?"等待被重定向到主页。这对我来说是一个完美的解决方案。
为了清楚起见,典型的预下载过程如下:
- 用户访问下载页面:[website]/download/page/123/
- 用户完成Recaptcha,被重定向到这里:[网站]/download/page/123/?等待
- 用户填写详细信息,被重定向到这里:[website]/download/page/123/?由于
- 用户收到他们的文件
很长,是的,但对于我的特殊需求来说,这将是最理想的。我还知道用户可以通过先添加"?"等待'到URL,然后追加'?事后谢谢你,但这真的真的帮不上什么忙。
所以,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.';
}
如果这一切都取决于请求本身中的信息,那么就没有办法强制执行您想要做的事情。引用者也只是一个任意的请求头。
您需要的是实际的服务器端状态。为用户打开一个会话,为他正在经历的进程指定一个随机的唯一id,该id在该进程的每个页面上携带,并保存会话中接下来要显示的进度和消息。不存在"基于http_referer的安全"这种东西。这是矛盾。
一般来说,你必须使用SESSION。在你的特殊情况下,这似乎也是最合适的:在会话中存储访问过的页面然后在其他页面