2009-07-01 72 views
3

我試圖找到一種安全的方式來做到以下幾點:的PHP文件系統函數發送變量表單提交

  1. 用戶輸入值轉換成HTML格式。
  2. 表單已提交。
  3. PHP使用提交的值作爲「scandir」函數的參數。

我的理論是在php腳本中包含邏輯,該腳本禁止絕對路徑,並要求目錄名稱包含一定的值。

我擔心的是黑客可以使用我的表單提交自己的價值並訪問敏感文件。

這是一個JQuery插件。我不希望用戶必須修改PHP文件。

下面的代碼如何被黑客攻擊?

<?php 

$foo = $_POST["some_directory"]; 

//validate $foo 

//make sure path to directory is relative 
$foo_url_test = parse_url($foo); 
if (isset($foo_url_test['scheme']) || isset($foo_url_test['host'])) { 
$foo = NULL; 
} 

//make sure the directory name contains 'bar123' 
$foo_name_test = preg_split('_[\\\\/]_', $foo); 
$foo_name_test = end($foo_name_test); 
$foo_name_test = strpos($foo_name_test,'bar123'); 
if ($foo_name_test === false) { 
$foo = NULL; 
} 

//make sure the path does not contain '..' 
$foo_dot_dot_test = strpos($foo,'..'); 
if ($foo_dot_dot_test == TRUE || $foo_dot_dot_test === 0) { 
$foo = NULL; 
} 

//get files 
$files_array = scandir($foo); 

?> 
+1

順便說一句,總是用'==='測試strpos()返回'false'! – deceze 2009-07-01 02:17:24

回答

0

您的目錄名稱可以包含..元素,使他們可以看到你爲了限制他們當前的工作目錄之外。儘管如此,它們仍然只能查看按照您打算命名的目錄。

FWIW,使用parse_url()來分析一個目錄名是否是相對的真的很奇怪。你爲什麼不只是尋找$foo[0] == '/'

(即假設一個Unix路徑慣例,當然,但你的代碼已經做到這一點。)

+0

感謝您的建議。我改變了我的問題中的代碼示例以適用於ms-dos或unix路徑類型。你有沒有看到任何問題? – edt 2009-07-01 17:31:19

2

你可能想看看realpath()

$foo = realpath($foo); 
if (substr($foo, 0, 8) != '/my/path') { 
    return false; 
} 

...或類似的東西。

1

您可能需要進一步闡述此腳本的目的以及爲何要讀取任意目錄。沒有這些知識,就很難評論這段代碼的安全性,除非指出這是一件非常危險的事情,對可訪問的目錄沒有明確的限制。例如,我就不會在我的服務器上安裝一個PHP腳本,它允許遠程攻擊者指定一個目錄來讀取 - 甚至可以找出是否存在特定的文件或目錄。

在設計需要用戶編輯配置文件,通過PHP讀取一個有力的論據,即允許服務器所有者白名單中的一組被允許通過這個腳本打開目錄

更新後回覆從OP

您在這裏的問題是所有的「ajax」請求直接由瀏覽器和從瀏覽器。這意味着Web服務器在發出ajax請求的html頁面中設置的任何數據都可能被惡意用戶覆蓋。您的ajax請求可以由任何人隨時用任何參數進行,除非您確保它不做其他事情。

只要數據離開服務器,就不能再信任它。確保安全的最好方法是在服務器端保存允許目錄的白名單。如果您收到不在允許列表中的目錄的請求(或者可能不在允許列表中的某個子目錄下),則拒絕該請求並提供標準錯誤響應。

+0

該腳本是一個將圖像顯示添加到網頁的JQuery插件。網站管理員將圖像所在目錄的名稱添加到插件語句中:我想要一種安全的方式來使用該設置,以便多個網頁可以使用插件不同的圖像和目錄,但都使用相同的PHP文檔。 – edt 2009-07-01 12:30:46