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