Как использовать путь $ _GET с файлами-файлами и сохранять их в безопасности?

У меня есть функция, чтобы проверить, существует ли файл через 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'); } 

Вот как я справлялся с этим в прошлом:

 $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 } 

Вы можете удалить любой путь из вашего имени файла:

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

Такая практика умеренно безопасна и быстра (сложность O (1)), но на самом деле она не самая лучшая, поскольку вы должны следить за кодировкой, заменой символов и всем подобным.

Но общая передовая практика (хотя и менее оперативная в зависимости от размера вашего каталога, скажем, сложности 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);