2012-09-29 63 views
3

我有一個函數來檢查一個文件是否通過jQuery存在,它調用了一個PHP腳本,當我點擊我的索引頁上的一個按鈕來改變某些圖像時,我將使用它。

jQuery函數:

function fileExists(path){ 
    $.getJSON("/ajax/fileExists.php",{ path: path }, 
    function (data){ 
     return data.path; 
    }); 
} 

fileExists.php:

$path=$_SERVER['DOCUMENT_ROOT'].'/packs'.$_GET['path']; 

if(file_exists($path)){ 
    echo json_encode(TRUE); 
}else{ 
    echo json_encode(FALSE); 
} 

我很擔心使用該腳本可以列出我的服務器或文件的內容的人,我可能沒有他們想要知道所以我已經使用DOCUMENT_ROOT和/ packs試圖限制對該目錄的調用,但我認爲人們可以簡單地在提供的路徑中使用../來檢查備選方案。

什麼是最好的方式來使這個安全,理想地限制它/包,並有任何其他問題,我應該擔心?

編輯:在JavaScript/jQuery的一個例子電話:

if(fileExists('/index.php')){ 
    alert('Exists'); 
}else{ 
    alert('Doesn\'t exist'); 
} 
+0

假設你控制要顯示的圖像,爲什麼你需要檢查它們是否存在? – phant0m

+0

我在現有的jQuery函數中使用它,它允許用戶從下拉列表中選擇紋理包,然後用所選紋理包中的所有圖像替換所有現有圖像。該功能旨在阻止它顯示不存在的圖像。 您可以在www.texturepacker.net上看到它的實際操作,但代碼與上面的代碼不同。 – dux0r

+1

注意:你的當前函數總是返回'undefined',因爲getJSON是異步的。所以你的'if'語句也不行。看看jQuery Deferreds,它應該可以幫助你解決這個問題。 – bfavaretto

回答

3

這是我如何在過去處理得:

$path = realpath($_SERVER['DOCUMENT_ROOT'].'/packs'.$_GET['path']); 
if (strpos($path, $_SERVER['DOCUMENT_ROOT']) !== 0) { 
    //It's looking to a path that is outside the document root 
} 
2

可以消除任何從你的文件名路徑橫移:

$path_arr = explode("/", $_GET['path']); 
$path = $path_arr[count($path_arr - 1)]; 

這樣的做法適度安全和快速(O(1)複雜性),但並不是真的最好,因爲你hav e注意編碼,字符替換和所有類似的東西。

但總體最佳實踐(雖然速度取決於你的目錄大小,假設O(n)的複雜性)將是使用readdir()獲取/ packs目錄中所有文件的列表,然後看看是否提供的文件名是:

$handle = opendir($path=$_SERVER['DOCUMENT_ROOT'].'/packs'); 
while (false !== ($entry = readdir($handle))) { 
    if ($entry === $_GET['path']) { 
    echo json_encode(TRUE); 
    return; 
    } 
} 
echo json_encode(FALSE);