2011-12-01 128 views
0

我必须编写一个页面,只允许点击特定链接的用户访问该页面。我不希望人们能够直接在地址栏中输入地址并获得访问权限。仅限于该页面上的特定页面和特定链接。PHP脚本阻止未经授权的用户访问页面

安全性对于产品下载非常重要。

任何人都知道我会如何在PHP中做到这一点?

+0

可能重复的[防止直接访问url](http://stackoverflow.com/questions/7414323/preventing-direct-access-from-url) –

+0

@MarcB对不起,我通过现有的问题很好看并没有找到我正在寻找的东西。我不认为这是你的链接重复。 –

+0

这个问题还有很多其他版本在浮动。它们都归结为同样的东西:至多可以让它更难阻止直接访问,但是你不能让它变得不可能。 –

回答

1

你最好的选择是使用会话,并有一个用户认证。然后你检查他们是否登录在这个“下载”脚本的顶部。

或者,您可以选中使用$_SERVER['HTTP_REFERER']变量,并在页面顶部检查它们是否来自正确的位置。这将(我认为)阻止用户只需直接去下载页面通过在URL

if ($_SERVER['HTTP_REFERER'] == 'http://mysite.com/downloadlist.php') { 
    //proceed 
} else { 
    //kick user out 
} 

打字但是就像我说,会议是去这里的路。从PHP manual上HTTP_REFERER:

的页面(如果有的话),其被称为用户代理到 网页的地址。这由用户代理设置。并非所有用户代理都会设置此项,有些用户代理可以将HTTP_REFERER修改为 功能。总之,它不能真正被信任。

+2

referer可以很容易被伪造:( –

+0

正如我在我的回答中提到的那样,但是OP显然对严格的安全性并不感兴趣,如果这是他/她想要去做的事情。 – MikeMurko

+0

具有挑战性的部分是他们将来自于第三方页面,因此,除了在该页面上发布指向用户下载页面的链接之外,我无法在其中使用代码。@MikeMurko - 您的解决方案在这种情况下不会起作用因为它将成为他们链接的特定页面?如果我将引用者设置为该页面,理论上,它似乎会这样做 - 思考? –

1

您需要建立会话跟踪(登录用户)。仅使用链接并使用引荐类型检查是不够的。

此外,对于下载,我将创建一个处理程序,如download.php文件,该文件将获取所需的页面以供下载。

这样,如果有人访问过一次,没有人会复制您的文档。

+0

不幸的是,我不能让用户登录这个案例。 –

+0

@DustinJames,那么你将不会有适当的安全性,推介可以被欺骗。 – Jakub

+0

我想,但我确实希望尽可能安全。 –

0

您也可以使用一些JS,因此当用户链接到您的页面时有一些POST参数,并且通过这种方式进行快速和肮脏的测试。关于如何做到这一点的链接是HERE。 Iaggree与其他人认为最好的方式和最安全的方式是使用某种形式的认证。

1

我会使用一次性哈希下载。向用户呈现下载页面和链接,如:

/download.php?downloadId=3B4A34086BH56FH5343DC 

散列存储到数据库。在download.php你检查散列是否在数据库中。如果是,则推送下载数据并从数据库中删除散列。如果其他人会尝试使用该链接,他将不会获取数据,因为散列不会再存在于数据库中。

(同样可以使用哈希命名的文件存档和unlink()如果您没有访问数据库)

+1

请注意,这也将阻止下载管理器的使用和下载恢复。 –

1

你不应该使用引荐作为身份验证方法。引用者可以很容易地更改或设置。例如,这个命令将我的引用设置为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/ 

你应该使用一次性的哈希下载脚本,或会话。