2012-09-06 121 views
0

我正在PHP中構建一個Web應用程序。用戶將通過他們的賬戶進入。他們將擁有像系統中的照片,筆記等資源,就像Facebook一樣。公共和私有資源管理

我的第一個問題是不讓任何人訪問一個帳戶的私人資源。假設這是一張圖片。有3種情況:

  1. 每個人都可以通過圖片的URL訪問該圖片。
  2. 該圖片的所有者帳戶的朋友帳戶可以訪問該圖片。
  3. 只有所有者帳戶才能看到該圖片,其他人無法看到該圖片。即使有圖片的URL。

我不知道Facebook是否做了類似於第1點的任何事情。因爲業務很重要,並且也是用戶的隱私。

我的第一個想法是通過PHP文件進行所有資源訪問。但過了一段時間它看起來非常複雜。

我的另一個想法是保存數據庫表中所有資源的列表,並將隱私設置在一起。這看起來更好,但我不確定性能如何受到影響。

你有什麼想法,你會如何建立一個這樣的系統?

P.S.我打算再添加一個Web應用程序,並創建一個共享資源區來放入共享資源。我也需要同樣的特權系統。

回答

1

以我的經驗,你可以通過上傳你的文件到一個不公開的目錄來解決這個問題。那麼你也會在你的數據庫中有一些表格,你至少有三列:文件的名稱,你想給它的訪問級別以及上傳文件的用戶

然後,您可以編寫一些內容來檢查訪問用戶是否有權訪問該文件。首先它將檢索包含有關所提到文件信息的列。根據這些信息,如果用戶有權訪問,請使用readfile(請參閱PHP手冊中的示例)顯示該文件。在其他情況下,您可以顯示一個403 Forbidden頁面。

在你的情況,檢查訪問將看起來像這樣的功能:

function hasAccess($accesslevel, $owner, $visitor) 
{ 
    if ($accesslevel === 'public') { 
     return true; 
    } 
    if ($accesslevel === 'private') { 
     return $owner === $visitor; 
    } 
    if ($accesslevel === 'friends') { 
     return $owner === $visitor || isfriend($visitor, $owner); 
    } 
} 

這只是一個例子,你的實現可能會有點不同,這取決於您的環境。

據我所知,Facebook只允許所有人查看所有文件,但是嘗試創建一個難以猜測的網址。只要你有了網址,無論上傳圖像的用戶的隱私設置如何,你都可以直接查看圖像。

+0

我不知道Facebook即使在私密的情況下也可以看到圖片。無論如何,臉書有大約8億個帳戶。如果每個帳戶至少有100張圖片,則會變成800億個文件。他們或者對數千臺服務器使用不同的技術或相同的技術。 – tcak

+0

@Johnny實際上,facebook使用了像[[user_id] _ [photograph_id] _ [random_number] _size'這樣的命名方案(不確定具體方案),他們可能會使用64位照片編號,這將允許大約10個每位用戶20張照片的強大功能。可以肯定地說,沒有人會達到......永遠! 800億隻是64位數中允許的最大數量的一小部分的一小部分。 – Ruben

2

嗯..

  1. 您在應用程序中有 「User_ID」。
  2. 你有目錄(網址)你想訪問。
  3. 此目錄擁有其所有者「User_ID」。像/store/user_9892/album_2/beer&girls.jpg

,這樣你們可以執行一個SQL查詢,檢查是否在目錄「User ID」是當前應用程序的劊子手ID或者他有業主爲好友。在那種情況下 - 給予訪問權限。否則 - 重定向403頭(或其他)。
這意味着你不需要任何具有資源等的表格。只需使用極其快速的SQL查詢來檢查owner \ friend狀態。

編輯:
對於其他應收委託U可以簡單地添加到您的'user'表字段..讓名字例如'access_accounts'。也許序列化數組,可能是特殊字符分隔的文本。我們再次所做的 - 檢入一個SQL查詢以獲取當前User_ID的權限。

如果我們需要進一步定義任何文件夾的任何訪問權限(對於任何人,對於任何人羣等)......所以是的,我想必須有一個像[path]=>[access_id]結構的表。但這個想法再次運行 - 簡單的一個SQL檢查。

P.S.所有這些意味着我投票贊成「通過PHP文件進行所有資源訪問」。這很容易就可以用.htaccess和php-script來完成,其中有一些SQL查詢和規則。

+0

您的示例不能解決問題。我應該如何設置隱私設置以訪問其他帳戶或公開? – tcak

+0

添加到回答一些進一步的建議。 – StasGrin