2013-04-22 4 views
0

В PHP я следующее:пользователь не может удалить файл

exec('remove_file.sh', $output, $return); 

где remove_file.sh является следующий сценарий:

#!/bin/sh 
rm -f /tmp/test.pdf 

Я проверил, что этот скрипт запускается с помощью www- data и test.pdf принадлежит myuser, но с 666 (rw-rw-rw-) разрешениями./tmp принадлежит root и имеет разрешение 666.

Сценарий возвращает 1 (общая ошибка) без вывода.

Если я пытаюсь из терминала:

sudo su www-data -c 'rm -f /tmp/test.pdf' 

я получаю:

cannot remove `/tmp/test.pdf': Operation not permitted 

Как я могу удалить этот файл из PHP-скрипта?

+0

Каков результат работы 'ls -al/tmp/test.pdf'? – fyr

+0

Вы пытались установить бит выполнения? chmod 777, чтобы дать rwxrwxrwx? каковы разрешения каталога? Http: //unix.stackexchange.com/questions/21251/why-do-directories-need-the-executable-x-permission-to-be-open – Waygood

+0

$ fyr: -rw-rw-rw- 1 myuser myuser – tihe

ответ

2

Возможно, вам необходимо убедиться, что у www-user есть разрешение на запись в каталог, а также файл. Это зависит от файловой системы, но в большинстве случаев это требуется для операций rm или mv.

Таким образом, chmod 777 /tmp должен сделать трюк.

Редактировать: Вышеупомянутый не может быть безопасным способом для достижения желаемой доступности. В зависимости от вашей установки более тщательным способом для этого было бы добавить www-user в группу users (при условии, что myuser основная группа - users), а затем установите для каталога /tmp значение rwx для пользователя &.

# usermod -g users www-user 
# chmod 770 /tmp 

Позволяя всем читать, писать и выполнять в /tmp не подходит для многопользовательских или необеспеченных коробков, и в то время как он может работать нормально на хорошо защищенный сервер, вы даете много доступа к любому, кто компрометирует коробку.

Еще одна альтернатива заключается в том, чтобы php загружать файлы в более локальный каталог вместо использования сценариев bash с использованием $_FILES, а затем снова использовать PHP, чтобы удалить их с помощью unlink. Таким образом, все файлы будут принадлежать www-user. Помните, что необходимо тщательно проверять файлы, прежде чем разрешать загрузку для предотвращения атак через c99 and similar malware.

EDIT (от OP):

Хотя вопросы безопасности не применяются в моем случае, я полностью согласен с предыдущим редактирования. Использование/tmp было ленивым выходом. Но реальная проблема заключалась в том, что я протестировал создание файла под своим собственным пользователем, а затем продолжил тестирование с www-data. В соответствии с разрешениями по умолчанию/tmp вы не можете (правильно) удалить другой файл пользователя и не перезаписать его. Это привело к различным проблемам, а не только к rm.

+0

chmod 666 фактически нарушил некоторые функции сеанса в моей системе (что я не понимаю, потому что я думаю, что разрешения были 666 уже), но 777 разрешил все проблемы, включая rm. Если хотите, отредактируйте свой ответ, чтобы я мог его принять. – tihe

+0

@zensys - Вероятно, это должно быть 722 (выполнить для владельца - только для записи для других), но отредактировано до 777, так как это работает для вас. –

+0

Даже лучше 'chmod 1777/tmp', так что только владелец файла может удалить или переименовать его. «1» - это [липкий бит] (http://en.wikipedia.org/wiki/Sticky_bit) – fedorqui

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