2016-01-11 3 views
0

Я пытаюсь использовать 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" 

Кто-нибудь сталкивался с этим поведением раньше?

+0

На странице руководства по PHP для realpath эта заметка существует: Бегущий скрипт должен иметь исполняемые разрешения для всех каталогов в иерархии, иначе realpath() вернет FALSE. http://php.net/manual/en/function.realpath.php – ckimbrell

+0

Вам не нужно давать реальный путь к функции realpath()? i.e realpath ("../../../ 20160111-133552-msg0000.wav"); –

+0

@ckimbrell Вся иерархия - 755, за исключением самого файла, который является 777. – csyria

ответ

0

Не принимайте следующие истины: этот ответ был составлен на основе краткого изложения подробного сочетания прав доступа: 755 уже разрешает выполнение для всех!


Вы сказали:

Вся иерархия 755, для самого файла, который 777.

Хотя PHP manual page говорит, кроме:

сценарий запуска должен иметь исполняемый файл разрешений на все каталогов в иерархии, иначе realpath() вернет FALSE.

Таким образом, вы должны установить всю иерархию на 777 на этот realpath() для работы.

+1

755 = rwxr-xr-x. Пользователь Apache попадает в другой, поэтому они имеют r-x. В этом случае действительно нужно разрешение на запись? – csyria

+0

@csyria. Ой, ты определенно прав. Я забыл подробное сочетание! Я отредактировал свой ответ, чтобы избежать предоставления ложной информации ... – cFreed

+0

Спасибо за это обновление @cFreed - я думал, что схожу с ума по поводу того, как работали права на файлы Linux! :) – csyria

1

Я думаю, что я решил это самостоятельно! Хорошо старина SELinux предотвращала HTTPD доступа к файлу:

type=AVC msg=audit(1452550767.071:18495): avc: denied { read } for pid=10397 comm="httpd" name="3000-20160111-133552-msg0000.wav" dev="0:41" ino=12483 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:nfs_t:s0 tclass=file 
    Was caused by: 
    One of the following booleans was set incorrectly. 
    Description: 
    Allow httpd to use nfs 

    Allow access by executing: 
    # setsebool -P httpd_use_nfs 1 

я только обнаружил это, когда я пытался сделать ReadFile() на .wav файл в вопросе и получил разрешение отказано ошибка, которая не сделала имеют смысл в файле 777. Проверено /var/log/audit/audit.log, и это было очевидно.

Запуск setsebool -P httpd_use_nfs 1 исправил его прямо для меня.

Смежные вопросы