2012-10-06 118 views
1

目前我保存用戶上傳的圖像文件如下:PHP在哪裏保存用戶上傳的圖像文件

public_html/img/user/$category/$username/$imagename 
然而

,這是不好的做法?爲什麼存儲在文檔根目錄下以及存儲文件的更好位置在哪裏?

我篩選器擴展如下:

// Check to see if the type of file uploaded is a valid image type 
function is_valid_type($file) 
{ 
    // This is an array that holds all the valid image MIME types 
    $valid_types = array("image/jpg", "image/JPG", "image/jpeg", "image/bmp", "image/gif", "image/png"); 

    if (in_array($file['type'], $valid_types)) 
     return 1; 
    return 0; 
} 
+2

如果你練習安全的上傳,這不是不好的行爲。但是,如果您的文件驗證不正確或不存在,則將用戶上傳的文件放入可公開訪問的目錄可能會導致您的服務器被徹底破壞,或者您的服務器成爲惡意軟件源。所以如果你是一位安全搖滾明星,那麼請隨意。否則,將它們填充到文檔根目錄之外並提供其他訪問方式。 –

+0

@Marc B謝謝你的回覆,我不認爲我是一個安全的搖滾明星,你能解釋一下你在文檔根目錄之外的意思嗎?以及您提供其他訪問方式的含義? – neeko

回答

2

與一些人認爲是不好的做法相反,位置本身不是問題;但你必須照顧幾件事:

  • 按擴展名篩選;只接受幾種圖像格式(.jpg,.gif,.png)並拒絕其餘的;絕對不接受.php擴展名

  • 不要相信瀏覽器發送的MIME類型,以確定圖像是否有效。使用getimagesize()自己做;通過在圖像中隱藏PHP腳本,這可以是fooled,但這就是爲什麼我們有一個更重要的步驟。

  • 重要 - 確保圖像不與PHP引擎一起提供;一些圖像可以製作成看起來像圖像但隱藏腳本的方式。爲此,請使用Web服務器的配置。

  • Other issues you need to be aware about when you're handling uploads

參見:Secure User Image Upload Capabilities in PHP

順便說一下,以測試PHP引擎沒有被用來爲圖像,確保expose_phpOn(你可以從phpinfo()告訴然後使用瀏覽器下載圖片,檢查響應標題,並檢查是否看到X-Powered-By標題;如果不在那裏,應該是安全的。

+0

謝謝你的回覆,如果我添加我的代碼顯示如何過濾擴展可以檢查它嗎?我將它添加到這個問題,我怎麼會把expose_php打開? – neeko

+1

@neeko你不應該相信瀏覽器發送給你的MIME類型。更新了答案。 –

+0

我檢查了我的php.ini文件和expose_php = on,如何檢查x-power-by標題?也可以給我一個很好的方式來篩選擴展的代碼示例,謝謝你的幫助! – neeko

1

更好保持公開可見的圖像文檔根目錄。但只存儲您想要顯示的圖像。不是另一個。並確保這些圖像文件是some gotchas

我有一個網站,用戶存儲圖像。但是我將文件名,類別,用戶名,圖像名稱保存到數據庫中,並將圖像文件保存在單個目錄中。

+0

謝謝你的回覆,我將文件名,類別,用戶名和圖像名稱存儲在數據庫中,我的圖像文件位於上面顯示的目錄中,並且是所有這些圖像都公開顯示 – neeko

+0

上傳驗證圖像文件 –

相關問題