簡體   English   中英

如何為用戶上傳的圖片提供服務?

[英]How do I serve user uploaded images?

我正在構建一個小型Web應用程序,該應用程序將允許登錄的用戶上傳產品圖片。 我正在嘗試正確構建,並且在過去進行一些幼稚的實現后,決定將所有上傳的內容添加到我的公用文件夾中。

\app (public folder)
-\index.php
\includes
\config
\uploads

這樣一來,如果惡意用戶設法上傳了PHP文件,則服務器將無法訪問或為其提供服務。

話雖如此,我將如何在網頁上提供這些圖片? 做這個的最好方式是什么? 過去,我曾使用過一個getImage.php文件,該文件帶有一個ID參數(以及一些生成值的散列,以避免用戶只是猜測ID),看起來像“ getImage.php?id = 555&c = 44j54k3h5”。 服務器在DB(真實路徑)中獲取圖像信息並加載內容,重建標頭,然后發送圖像。

關於此方法是否有安全方面的考慮? 有沒有辦法使它更漂亮? 是否有一個htaccess重寫規則來查找/images/imagename.jpg並將其發送到我的getImage.php文件,這會增加安全漏洞? 任何有關最佳做法的建議將不勝感激。

查看該課程。 它將處理上傳,進行安全檢查並為您提供咖啡:)

http://www.verot.net/php_class_upload.htm

您提供上載圖片的方法的安全性確實取決於許多其他因素。

  • 上傳時如何處理和保護圖像/文件? 上傳的目錄/文件權限是什么?
  • 哪些進程可以讀取和寫入這些位置?
  • 您擁有哪種類型的文件處理程序可以執行任意文件?
  • 如果您要使用PHP-> get_image-> display_image路由,它會嘗試防止在上傳后(在getimage上)惡意的意圖嗎?

我將使用Apache mod_alias引用webroot之上的目錄。 這樣,您仍然可以使用指向圖像的鏈接,而無需打開完整的root-root目錄進行曝光。

“更漂亮”的方法是使用.htaccess重定向

RewriteEngine On                                                                                                                                                                                                                                  
RewriteBase /                                                                                                                      
RewriteRule ^getImage/([0-9]+)/(.+)\.png$ getImage.php?id=$1&c=$2 [NC,L]

然后在getImage.php

if (isset($_GET['id']) && isset($_GET['c'])) {

    // set headers
    header("Content-Type: image/png");

    // cache control
    header("Cache-Control: private, max-age=10800, pre-check=10800");
    header("Pragma: private");
    header("Expires: " . date(DATE_RFC822, strtotime("2 day")));
    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
            header('Last-Modified: ' . $_SERVER['HTTP_IF_MODIFIED_SINCE'], true, 304);                                    
            exit;                            
    }

    /* do things */
    imagepng($image_resource);
    imagedestroy($image_resource);
}
else {

    echo "bad request";
}

所以代替

site.com/getImage.php?id=555&c=44j54k3h5

你會用

site.com/getImage/555/44j54k3h5.png

使用這種方法不會增加任何安全風險或漏洞。 只需確保在查詢之前對get變量進行轉義即可避免注入攻擊。

如果您想保護自己免受惡意文件上傳的侵擾,則需要在提供服務之前先這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM