2011-08-04 27 views
0

一個鎖文件,我想只有讓用戶能夠點擊一次鏈接,像這樣的:使用Cookie作爲PHP

http://www.blah.com/download.php?file=zFZpj4b2AkEFz%2B3O

每個用戶都有發送的電子郵件一個獨特的鏈接,當他們點擊它時,我想在服務器上設置一個cookie,所以我知道再次拒絕該鏈接的訪問。

任何想法歡迎。

謝謝。

+0

Cookies是存儲在客戶端,所以你不能做到這一點。如果下載文件出現問題怎麼辦? – Quentin

+1

如果你真的不希望用戶點擊兩次,你可以在db中創建一個關於點擊事件的記錄... – k102

+0

默認情況下,Internet Explorer會阻止下載,一旦你點擊確定,它會刷新頁面,你的代碼會看到這是一個雙擊 –

回答

1

阻止重複下載可能導致的問題(特別是與互聯網探索者文件攔截,導致頁面刷新)。

Cookie是錯誤的答案,因爲所有用戶必須做的是使用不同的瀏覽器/計算機或清除他們的Cookie重新下載。

如果你不顧一切地做到這一點怎麼樣

在文件系統上創建符號鏈接到真正的文件和名稱的鏈接一樣的密鑰。

在處理頁面請求:

  1. 驗證URL字符串(以避免路徑跳轉等)
  2. 檢查該鏈接的存在,如果不存在鏈接無效/過期等等顯示錯誤
  3. 否則,將文件複製到響應
  4. 刪除鏈接
+0

這聽起來像一個計劃!謝謝。首次使用獨特的鏈接創建符號鏈接,然後拋出一個「已訪問」錯誤(如果存在的話)?儘管如此,我已經脫離了PHP的文件系統。任何代碼片段都會非常受歡迎! –

+0

[PHP手冊在符號鏈接](http://php.net/manual/en/function.symlink.php)。您需要某種方式來清除您創建的所有額外符號鏈接。此外,由於您正在阻止其他人訪問該網址,因此您可以另外將該密鑰存儲在用戶會話中作爲覆蓋,以便他們刷新頁面。 –

+0

謝謝你的幫助! –

1

在download.php上檢查是否存在像AlreadyAccessed這樣的cookie,如果存在,否認下載,否則開始下載文件並設置cookie。這就是它

0

Cookie存儲在客戶端,而不是服務器端,所以這不是正確的選擇。如果用戶刪除了您網站的Cookie,他將能夠規避基於cookie存在/價值的任何檢查。

可能發送鏈接時在服務器上創建具有特定名稱的文件,並在訪問該文件後將其刪除。如果有人試圖再次訪問該鏈接,則「標誌」文件將不存在,您將知道這是重複(或無效)鏈接。

(將與數據庫雖然,基於文件的檢查是很難在非活潑的方式做。更好)

+0

來自Cherokee Web服務器項目的隨機示例:http://www.cherokee-project.com/doc/modules_handlers_secdownload。html –