2010-01-06 132 views
1

我有一個PHP腳本,它可以嘗試訪問具有敏感數據的目錄中的文件。我想限制這樣的操作。如何限制文件系統訪問PHP腳本?

我想讓這個腳本只訪問我指定的目錄中的文件/目錄。有可能嗎?謝謝。

+0

這是一個是/否的問題;)答案是肯定的。 – Gordon 2010-01-06 14:43:34

回答

2

免責聲明$ allowedPaths的具體名單:如果不控制PHP設置在服務器上的方式,這個答案是沒用的。

我們確實需要更多關於PHP設置的信息,比如它使用的是哪個Web服務器以及哪個SAPI模式。你可以找出哪個SAPI模塊正在使用的運行echophp_sapi_name()

但是,如果我想這是Apache 2.2的與mod_php的:

PHP的Apache模塊版本上運行的Web服務器的用戶和組。還有第二個名爲suPHP的Apache模塊,它封裝了PHP CGI版本,使其作爲腳本的所有者和組運行(並避免必須手動設置Apache的suEXEC)。

除此之外,更改文件系統的權限以便用戶不具有對敏感目錄及其文件的讀訪問權限應該足夠好。

0

您將不得不配置目錄的權限,以便用戶PHP無法訪問它們。

要在Linux/Unix系統上這樣做,您需要更改目錄所有者(chown)並更改其權限(chmod)以及可能的命令行訪問權限。這真的取決於你的服務器是如何配置的,誰擁有這些文件,以及PHP運行的是誰。

要在Linux系統上找到PHP用戶的用戶標識,請使用posix_getuid()

我可以想象除了通過disable_functions刪除某些功能的訪問權限外,沒有其他方法可以保護PHP側訪問文件。不過,這可能(也可能會)也會打破許多合法行爲。

+0

我想,他想從PHP控制這個,例如檢查文件是否包含允許的路徑。至少我是這樣理解這個問題的。 – Gordon 2010-01-06 14:47:48

+0

我認爲戈登的答案是最合適的。當然,文件權限應該適當設置,但是這會影響服務器上的所有** php腳本 - 在這種情況下,運行chroot和/或設置open_base_dir將是明智的。 C. – symcbean 2010-01-06 17:41:02

+0

對我來說,這個問題聽起來像OP有一個他想要運行的第三方編碼腳本,並且希望確保它不會在服務器上發生任何不愉快的事情。在這種情況下,設置正確的權限可能是最好的選擇。 – 2010-01-06 18:34:25

2

是的,只需編寫腳本,以便它只訪問安全目錄中的文件。不要(永遠)從用戶輸入中的未經檢查的路徑訪問文件。根據可接受的路徑和/或文件名列表檢查路徑,或在代碼中包含路徑以訪問該文件,以便只將文件名傳遞給訪問代碼。

這些功能將幫助: pathinfo()dirname()basename()

1

像這樣的東西應該工作:

function isBelowAllowedPath($file, $allowedPath) 
{ 
    return (strpos(realpath($file), $allowedPath) === 0); 
} 

isBelowAllowedPath('/etc/passwd', '/var/www/pub/'); // false 
isBelowAllowedPath('/var/www/pub/index.htm', '/var/www/pub/'); // true 

,或者如果你想確保$文件是存在的,以及

function isBelowAllowedPath($file, $allowedPath) 
{ 
    return file_exists($allowedPath . basename(realpath($file))); 
} 

isBelowAllowedPath('/../../../../etc/passwd', '/var/www/pub/'); // false 
isBelowAllowedPath('index.htm', '/var/www/pub/'); // true 

或者如果你想$文件在一個(不低於路徑)

function isInAllowedPath($file, array $allowedPath) 
{ 
    $fileDir = realpath(dirname($file)); 
    return (in_array($fileDir, $allowedPath)); 
} 

$allowed = array('/var/www/pub/', 'somewhere/else'); 
isInAllowedPath('/var/www/pub/foo/index.htm', $allowed); // false 
isInAllowedPath('/var/www/pub/index.htm', $allowed); // true