2011-10-09 67 views
7

爲了安全起見,我將一組文件和文件夾移動到apache服務器上的web根目錄之外,然後我將動態地爲它們提供服務。 這似乎比2層的替代品:如何使用PHP從Web根外部提供文檔?

  1. 發表他們的網絡訪問,只是創建被預置到每一個文件一個PHP登錄頁面。問題是他們是不是所有的PHP文件,我不能在前面加上一個PHP login文件爲PDF,圖像等
  2. 發表他們的網絡訪問和使用HTTP認證來限制訪問整個目錄。但是,引入了問題,包括明文密碼,沒有優雅的退出方式等

所以我們又回到了讓他們的網站根目錄外,但動態地爲他們提供服務。我遇到的問題是,因爲它們都是不同的文件類型(php腳本,txt,pdf,jpg)我不確定我是否應該使用include()readfile()。我遇到了爲每個文件發送適當標題的問題,以便瀏覽器正確顯示它們。

我錯過了另一個神奇的解決方案嗎?有沒有一個框架避免了我處理動態文件和頭文件的服務?

(FYI我的共享主機上運行Linux操作系統,Apache & PHP)

+1

哇,你正在服用簡單的問題,並把它變成一個很難。 –

+2

@Dietrich那麼簡單的解決方案是什麼? –

+0

@Pekka:HTTP摘要認證,告訴用戶關閉他們的瀏覽器註銷。 –

回答

8

我覺得像這樣的工作:

<?php 
$path = realpath(dirname(__FILE__) . '/../my_files/' . $_GET['file']); 

$parts = explode('/', pathinfo($path, PATHINFO_DIRNAME)); 
if (end($parts) !== 'my_files') { 
    // LFI attempt 
    exit(); 
} 

if (!is_file($path)) { 
    // file does not exist 
    exit(); 
} 

header('Content-Type: ' . mime_content_type($path)); 
header('Content-Length: ' . filesize($path)); 

readfile($path); 
+1

我會用fileinfo函數替換'mime_content_type()',否則是。 –

0

我能想到的最簡單的方法是使用。 htaccess文件。當然,假設您的Web服務器是Apache。

你可以拒絕訪問文件和/或目錄的任何一種(個),每個人只允許本地主機。這樣,即使他們知道正確的路徑/ URL,他們也不會被公開,但服務器和PHP將能夠爲他們服務。

對於不同的Web服務器,必須有相同的解決方案。此外,您可以隨時切換到Apache :-)

+0

那麼,隱藏公衆的文件不是問題。將它們移到Web根目錄之外或使用.htaccess限制訪問權限與我等同。我的問題是在需要時有選擇地向授權用戶提供這些文件的好方法。 – Andrew

+0

......並且可能不使用簡單的http認證。否則,.htaccess仍然是一個選項。 – GolezTrol

+0

這兩個問題是獨立的...但是,由於你花了一段時間來解釋你將它們從網頁根目錄中移出的選擇,我想我會指出這不是一個必要的步驟。也就是說,當你說「...爲了安全,我正在移動...」時,這不是一個準確的理由或措施。 –

相關問題