2014-02-08 100 views
2

我在我的網站上有一個包含* .jpg文件的密碼保護目錄(帶有.htaccess)。我不希望任何人都可以直接訪問這些.jpgs - 但我想讓一個php腳本顯示* .jpg文件。有這樣的可能嗎?如何使用php查看保護文件夾中的圖像?


對於那些誰不知道爲什麼我想這個: 我有一個登記表,其中用戶可以上傳圖片,並完成註冊之前,他可以檢查是否正確的畫面被上傳。目前,我將上傳的圖片保存在一個臨時目錄中,如果他完成了,我將圖片移動到密碼保護目錄。但是,在每次註冊時,我都不喜歡這種情況,圖片公開時間很短(例如通過搜索引擎)。更糟糕的是,當某人上傳圖片但未完成註冊時,圖片將永遠保留在臨時目錄中,除非我以某種方式刪除。但是,如果我在特定時間內設置了一個cron-job來刪除臨時目錄中的所有圖像,那麼如果他在不利的時刻註冊,某人的照片可能會被刪除。

+0

您可以使用robots.txt來從該目錄中屏蔽抓取工具。你可能想檢查深入鏈接,可能會幫助你一點。 – Martijn

+5

PHP不關心你的'htaccess'配置,直接聯繫文件系統,除非你想從另一臺服務器上獲取文件。 – h2ooooooo

+0

@ h2ooooooo如果我包含圖片,用戶需要爲我的受保護目錄輸入用戶名和密碼。所以PHP。不關心我的htaccess,還是我想念你的觀點? – Adam

回答

7

h2ooooooo已經在評論部分回答了我的問題。

這是它是如何工作的代碼,在我的代碼我有

<img src='image.php'> 

和圖像,以取代

<img src='link/to/protectet/picture.jpg'> 

。PHP只包含

<? 
header('Content-Type: image/jpeg'); 
readfile('link/to/protectet/picture.jpg'); 
?> 

工作。謝謝。

0

我不知道,這是否是你想要達到的目標,但我的理解是:

  1. 有是指存儲在.htaccess密碼保護文件夾,只有註冊的一組圖片文件和經過驗證的用戶可以直接在該文件夾中下載文件。

  2. 對於新註冊的用戶,有一個時間段,當上傳圖像的會話被允許下載圖像時,但不允許其他會話,無論是否經過身份驗證,都可以這樣做。

爲了做到這一點,你大概可以:

  1. ,因爲你需要從有效圖像區分臨時圖片:存儲前者/ temp文件夾實際上是一個好主意,因爲臨時文件永遠不會混淆有效的文件。

  2. 對於每個正在嘗試註冊的會話,您都可以使用session_id()(即$name = session_id() . '.jpg')爲您上傳的圖像文件命名。然後一個簡單的腳本(類似於:php, file download)可以提供與當前會話相關的存儲圖像。此腳本可以是登記表上<img>標記的源地址。

  3. 至於在/臨時放棄的圖像 - 一個cron工作可以擺脫他們的確。通過爲每個文件調用mtime() - 您可以輕鬆地忽略最近創建的文件 - 因此它們可能仍在使用中。

0

h2ooooooo接受的答案很好。但是,是什麼阻止某人輸入image.php的url地址並被提供給圖像? (事實上​​,這是我嘗試過的,我不幸能夠獲取圖像,即使它在密碼保護的文件夾中。)

看來我們需要一種確定請求來自頁面的方式在同一個網站上,或者可能在這次調用之前建立一個會話變量,並在提供圖像之前檢查它的存在。有針對here好的建議:How to check if a request if coming from the same server or different server?

最後我做了以下(<img src="getUploadFile.php?fname=my.jpg">):

<? 

function requestedByTheSameDomain() { 
    $myDomain  = $_SERVER['SCRIPT_URI']; 
    $requestsSource = $_SERVER['HTTP_REFERER']; 

    return parse_url($myDomain, PHP_URL_HOST) === parse_url($requestsSource, PHP_URL_HOST); 
} 

if(requestedByTheSameDomain()) { 
    $inputArr = array(); 
    if($_SERVER["REQUEST_METHOD"] == 'POST') { 
     $inputArr = $_POST; 
    } 
    else { 
     $inputArr = $_GET; 
    } 
    $fname = $inputArr['fname']; 
    $path_info = pathinfo($fname); 
    $ext = $path_info['extension']; 

    if (in_array($ext, array('jpg','png','gif','jpeg','bmp','tif','tiff'))) { 
     $type = 'image'; 
     $subType = $ext; 
     if($ext == 'jpg') $subType = 'jpeg'; 
     if($ext == 'tif') $subType = 'tiff'; 
     if($ext == 'svg') $subType = 'svg+xml'; 
    } 
    else if(in_array($ext, array('mpg','ogg'))) { 
     $type = 'audio'; 
     $subType = $ext; 
    } 
    else if($ext == 'mp4'){ 
     $type = 'video'; 
     $subType = $ext; 
    } 
    else if($ext == 'pdf') { 
     $type = 'application'; 
     $subType = $ext; 
    } 

    header("Content-Type: $type/$subType"); 
    readfile("images/$fname"); 
} 
?> 

剩下的工作就是禁用右鍵單擊和/或服務於它的背景圖像來呈現保存圖像一樣困難。

+0

你是對的,應該考慮如何防止其他人也獲得圖像,但這不在OP的範圍內。 – Adam