Правильные разрешения загрузки файлов PHP - PullRequest
0 голосов
/ 04 сентября 2010

Я разработал скрипт менеджера загрузки / выгрузки.

Когда я загружаю файл методом POST, он сохраняется в папке с именем files , папка files находится в другой папке, которая называетсяменеджер загрузок.

Теперь кажется, что когда я загружаю через метод POST, 0666 CHMOD работает, когда я хочу переименовать, удалить файл, но папка менеджера загрузок и папка файлов должны быть 0777 CHMOD для этогоРабота.Теперь кто-нибудь может сказать мне, если это опасно?

1) Я получил отказ в all .htaccess, чтобы никто не мог получить доступ к каталогу файлов через браузер

2) Скрипт загрузки защищенимя пользователя и пароль, которые лицо, использующее сценарий, очевидно, изменит, поэтому только администраторы могут загружать, переименовывать, редактировать, удалять файлы и записи в базе данных MySQL.

При загрузке файла записьдобавляется в базу данных с такой информацией, как тип файла, имя файла, размер файла и т. д., а затем уникальный идентификатор (автоматически увеличивается с помощью MySQL) добавляется к файлу process.php, который получает файл из каталога, тип mime и т. д., который не раскрывается, process.php в основном выполняет проверки, чтобы определить, существуют ли запись и файлы, и если это так, принудительно загружает этот файл.

В основном URL-адрес загрузки имеет вид: wwww.mydomain.com/process.php?file= 57, выполняется проверка, чтобы убедиться, что идентификатор существует в базе данных и существует файл с хранилищем имен файловd в базе данных с этим идентификатором.

Теперь все это прекрасно работает при загрузке файла через форму с использованием метода POST, но я также добавил ручную загрузку, чтобы люди, которые хотят загрузить файл, размер которого больше, чемРазмер их веб-хоста позволяет им просто загрузить файл, например, через программу FTP, а затем просто вручную добавить имя файла и сведения о файле через форму в административной области, чтобы связать запись с файлом.Тогда проблема заключается в разрешении, потому что если файл загружен через FTP или каким-либо другим способом, которым они загружают файл с помощью сценария php, невозможно переименовать, удалите файл, если это потребуется в будущем, так как сценарий php не имеет правильных привилегий.Итак, из того, что я понял, единственный вариант - это сказать тем, кто использует скрипт, изменить файл chmod на 0777, чтобы он работал, я думаю, что это заставит его работать?

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

Я разработал сценарий для обнаружения таких проблем, уведомления пользователя и т. д., но я хотел бы попробовать и заставить этот сценарий выполнять всю работу или почти все без необходимостиукажите в руководстве, что администратору придется изменить файл на 0777, когда он хочет переименовать скрипт, удалите файл, хотя я не знаю, позволит ли изменение файла на 0777 действительно переименовать скрипт php,удалите его и т. д., но также проблема безопасности.

ОБНОВЛЕНО

Хорошо, спасибо, что заколол файл перед изменением его при загрузке?

Я просто использую chown () вокруг файла и ничего больше, и это сделает его принадлежащим процессу сервера и сделает его приватным?как я вижу, вы получили

chown apache:apache '/path/to/files' ;

Нужно ли добавлять бит apache: apache?

Я действительно думал об этом как о более простом решении, если администратор выполняет загрузку вручную, сообщая им, что ему придется переименовывать / удалять файл вручную, если это потребуется в будущем, поскольку у сценария не будет необходимых разрешений для этого,тогда это сделает это простым решением, так как сценарий manualupload может просто переименовать запись в базе данных, чтобы она оставалась связанной с файлом.Таким образом, не стоит беспокоиться о проблемах с правами доступа к файлу.

Просто поместите файл изменений пользователя вручную через ftp, например, из myfile.zip в somefile.zip, затем они редактируют запись базы данных для этого файла и изменяют имя файла на somefile.zipот старого имени файла myfile.zip, таким образом, все еще связано, но не беспокоится о проблемах с разрешениями.Как я уже читал, chown () не всегда работает или на него нельзя полагаться по какой-либо причине.

Ответы [ 2 ]

1 голос
/ 04 сентября 2010

1) Я получил отказ в all .htaccess, чтобы никто не мог получить доступ к каталогу файлов через браузер

Храните ваши файлы в отдельной папке, вдали от структуры каталогов, в которой хранятся ваши PHP-файлы.

Что касается разрешений для каталога, существует три способа настройки разрешений для папки:

  1. Сделать его доступным для записи (chmod 0777 '/path/to/files/')

    Это не рекомендуется, поскольку оно имеет серьезные последствия для безопасности, особенно на невыделенном сервере; любой, у кого есть учетная запись или кто-то может указать процессу на сервере, чтобы он записал / удалил эту папку, сможет изменить ее содержимое.

  2. Сделать его временным (chmod 1777 '/path/to/files/')

    Это также связано с проблемой безопасности, но не так, как в варианте 1, по следующей причине: пользователи не могут изменять каталог - только файлы, которыми они владеют.

  3. Сделать его принадлежащим процессу сервера и сделать его частным (chown apache:apache '/path/to/files' ; chmod 0700 '/path/to/files')

    Возможно, это лучшее решение.

0 голосов
/ 04 сентября 2010

Просто расслабьтесь и наслаждайтесь.
На многих общих хостингах это единственно возможное решение в любом случае.
Есть еще один вариант - попросить пользователя пройти ftp и использовать ftp для копирования файлов из tmp, как это делает wordpress.Но я думаю, что это еще менее безопасно.

...