2011-12-01 131 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/ 

你應該使用一次性的哈希下載腳本,或會話。