2012-07-29 81 views
1

我目前正在嘗試使用CodeIgniter開發圖像上傳網站。 事情是,我今天遇到了一個問題,我真的很感謝任何形式的幫助,以解決它。CodeIgniter - 用戶應該只能訪問自己的圖像

所以基本上,該網站正在工作。但事情是,這些文件不是私人的。用戶可能希望確保用戶上傳的文件只能由他們看到,而不是由只猜測一堆網址的人看到。 (例如,user1上傳他想要保密的image1,對於他自己=> [localhostlocalhost/upload_script/files/image1.jpg],user2可以通過猜測並輸入url [localhost/upload_script/files/image1.jpg]來訪問image1。這是我們不希望發生的事情。) 我已經做了一些研究,我認爲這可能需要另一個控制器來提供文件(它檢查會話數據)。 過去,我一直在PHP中使用會話等「玩」,但我在CodeIgniter中並不熟悉它們。 這是唯一的方法嗎?我不認爲我需要爲每個用戶創建單獨的目錄,對嗎?你能告訴我如何去正確的方向或給我一個例子嗎?

由於提前,

harris21

+0

只是當你在數據庫中插入圖像路徑在列中添加用戶ID user_id – 2012-07-29 11:07:13

+0

@raheelshan它不會保護圖像。 – 2012-07-29 11:08:27

+0

可能您需要爲'img'標籤創建一個幫助器,它將檢查圖像是否屬於當前用戶。圖像可能被放置在web根目錄之外,所以不會直接訪問,但它可能會減慢你的應用程序的速度,因爲在那種情況下,你需要通過php腳本 – 2012-07-29 11:11:19

回答

3

性能命中爲了保護文件,你需要讓他們到網站根之外,否則別人會總是能夠網址破解他們的方式。

我已經使用非常方便的mod_xsendfile apache(如果你有這種類型的訪問你的服務器),這將允許你提供的文件,可以通過訪問控制保護,沒有適當的憑據沒有訪問。

代碼片斷,你可以把你的CI控制器來顯示圖像(改編自mod_xsendfile頁):

... 
if ($user->isLoggedIn()) 
{ 
    header("X-Sendfile: $path_to_somefile"); 
    header('Content-Type: image/jpeg'); 
    exit; 
} 

如果您不能安裝mod_xsendfile那麼你唯一的選擇是使用readfile()作爲TheShiftExchange說。

+0

而不是$ path_to_somefile我需要放置像basename($ _ FILES ['file'] ['name']); ?? – harris21 2012-07-29 16:54:07

+0

如果這個腳本是上傳過程的一部分,那麼是的,應該是這樣的。否則,你會希望有某種對象/助手類,它可以幫助你找到給定用戶的文件系統上的文件,以便確定路徑 – 2012-07-30 11:34:38

2

使用PHP返回圖像,並鎖定了Web服務器根後面的圖像目錄。這樣,在提供圖像之前,您可以通過會話變量檢查用戶憑據,確保允許他查看圖像。否則,您可以將用戶直接重定向到網站,提醒他無法訪問。像這樣提供圖像比通過網絡服務器(apache,nginx,...)提供圖像要慢,但它可以讓你控制圖像的下載。

更確切地說,將圖像細節保存在數據庫中,例如具有列:id,file_path,title,uid。每當用戶想要下載一個圖像,例如調用http://domain.com/files/download/3,您可以檢查是否可以爲當前登錄的用戶下載帶有標識爲3的圖像。你需要編寫你自己的控制器,將會這樣做。

我正在做一個類似的事情在這裏http://www.mediabox.si/你可以檢查如何提供圖像。我允許縮略圖圖像,並且可以爲普通訪問者提供可見的較大圖像的水印。

+0

如果user1想要訪問http://domain.com/files/image2(通過猜測的URI說),這是user's2圖像,我想通過查看這個圖像切斷對他的訪問......控制器將如何檢查用戶是否可以訪問此圖像? – harris21 2012-07-29 11:36:33

+0

Harris,/ files/image2中沒有圖像。所有的圖像必須安全地存儲在網站的根目錄下,所以沒有人可以直接進入。關於用戶檢查:在認證登錄時,您可能會將user_id保存在會話中。如果您在會議中擁有該功能,則可以輕鬆地將用戶的user_id與圖像表中所需的user_id進行比較。 – 2012-07-29 11:45:05

+0

也許這將清除一些事情,看看它:http://stackoverflow.com/questions/1851849/output-an-image-in-php – 2012-07-29 11:54:11

1

唯一的方法是將圖像存儲在public_html之外。否則根據定義,您打開文件以直接訪問。

使用控制器檢查,如果用戶被允許訪問文件和PHP函數ReadFile的()來提供服務的文件

你可以在這裏我的其他問題,一個讀了一些代碼:Does this PHP function protect against file transversal?

這其實是非常快的 - 你不會注意到在所有

+0

我會看看...謝謝。 我會盡快回復並回復。 – harris21 2012-07-29 15:44:18

相關問題