Я пытаюсь использовать realpath(), чтобы избежать атаки обхода каталога, и я не могу понять, почему он возвращает false в файл, который определенно существует.PHP - realpath не работает; файл определенно существует
Файлы размещаются на общем ресурсе NFS, к которому имеет доступ пользователь Apache. Вся иерархия 755, для самого файла, который 777.
Вот фрагмент кода, за исключением:
$path = "/mnt/share/path/to/20160111-133552-msg0000.wav";
$path = realpath($path);
var_dump($path);
Результат:
bool(false)
файл, безусловно, есть. Я су-эд в пользователя Apache и побежал:
bash-4.2$ ls -lah /mnt/share/path/to/20160111-133552-msg0000.wav
-rwxrwxrwx. 1 1001 1001 77K Jan 11 13:35 /mnt/share/path/to/3000-20160111-133552-msg0000.wav
Еще одно наблюдение: Когда я удалить имя файла из переменной $ PATH:
$path = "/mnt/share/path/to/
это работает просто отлично:
string(39) "/mnt/share/path/to"
Кто-нибудь сталкивался с этим поведением раньше?
На странице руководства по PHP для realpath эта заметка существует: Бегущий скрипт должен иметь исполняемые разрешения для всех каталогов в иерархии, иначе realpath() вернет FALSE. http://php.net/manual/en/function.realpath.php – ckimbrell
Вам не нужно давать реальный путь к функции realpath()? i.e realpath ("../../../ 20160111-133552-msg0000.wav"); –
@ckimbrell Вся иерархия - 755, за исключением самого файла, который является 777. – csyria