我必须编写一个页面,该页面只允许点击特定链接的用户访问该页面。我不希望人们能够直接在地址栏中键入地址并有权访问。仅来自该页面上的特定页面和特定链接。
安全性非常重要,因为它适用于产品下载。
任何人都知道如何在PHP中执行此操作?
答案 0 :(得分:1)
您需要建立会话跟踪(记录用户)。仅使用链接并使用推荐类型检查是不够的。
同样对于下载,我会创建一个像download.php
文件这样的处理程序来获取要下载的页面。
如果有人访问过一次,没有人会复制你的文件。
答案 1 :(得分:1)
您最好的选择是使用会话并对用户进行身份验证。然后,检查他们是否已登录此“下载”脚本的顶部。
或者,您可以选中使用$_SERVER['HTTP_REFERER']
变量并在页面顶部检查它们来自正确的位置。这会(我认为)阻止用户通过输入URL直接进入下载页面
if ($_SERVER['HTTP_REFERER'] == 'http://mysite.com/downloadlist.php') {
//proceed
} else {
//kick user out
}
但就像我说的那样,会议是去这里的方式。来自HTTP_REFERER上的PHP manual:
将用户代理引用到的页面地址(如果有) 当前页面。这是由用户代理设置的。并非所有用户代理都会 设置这个,有些提供修改HTTP_REFERER的能力 特征。简而言之,它无法真正被信任。
答案 2 :(得分:1)
我会用一次哈希下载。向用户显示下载页面和链接,如:
/download.php?downloadId=3B4A34086BH56FH5343DC
哈希存储到数据库中。在download.php
中,检查哈希是否在数据库中。如果是,则推送下载数据并从数据库中删除哈希。如果其他人试图使用该链接,他将无法获取数据,因为哈希将不再存在于数据库中。
(如果您没有数据库访问权限,可以使用散列命名文件存档,并使用unlink()存档)
答案 3 :(得分:1)
您不应将referer用作身份验证方法。可以轻松更改或设置引用者。例如,此命令将我的引用设置为stackoverflow.com:
curl -e http://stackoverflow.com/ -D - brb3.org/referrer.php
它的输出看起来像这样:
HTTP/1.0 200 OK
Date: Thu, 01 Dec 2011 17:43:55 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze3
Vary: Accept-Encoding
Content-Length: 54
Content-Type: text/html
X-Cache: MISS from localhost
X-Cache-Lookup: MISS from localhost:8080
Via: 1.0 localhost (squid/3.1.14)
Connection: keep-alive
$_SERVER['HTTP_REFERER'] = http://stackoverflow.com/
您应该使用一次性哈希下载脚本或会话。
答案 4 :(得分:0)
您可以使用PHP HTTP身份验证:
答案 5 :(得分:0)
你也可以使用一些JS,所以当用户链接到你的页面时附加一些POST参数,并以这种方式进行快速而肮脏的测试。有关如何操作的链接是HERE。与其他人一致认为,最好的方式和最安全的方式是使用某种形式的身份验证。