Хороший способ обеспечить загрузку файлов в PHP - PullRequest
2 голосов
/ 16 мая 2009

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

Наш текущий прототип просто выгружает файл в / {app_root} / files / , но, конечно, любой может это сделать, даже если он не вошел в систему или не использует систему. Цель состоит в том, чтобы предоставить доступ ( просмотр доступа ) к файлам, только если пользователь вошел в систему и фактически имеет доступ к сообщению, к которому принадлежит файл.

Итак, вкратце, я ищу хороший способ сделать это.

Я подумываю либо о создании папки вне папки / web / ( http ), а затем о том, чтобы PHP каким-то образом ее отобразил, используя header () commans или, может быть, просто сбросить файл в базу данных? Однако я никогда этого не делал.

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

1 Ответ

9 голосов
/ 16 мая 2009

Вы должны сделать следующее:

  1. Переместите все файлы из руткита. Вы можете отключить доступ к папке с помощью .htaccess, но это не стоит хлопот и потенциальной угрозы безопасности. Просто переместите его туда.
  2. Храните таблицу загруженных файлов, сохраняя там оригинальное имя файла пользователя. Переименуйте файл в $id.$ext и так далее. Короче говоря, вы не хотите использовать имя файла пользователя в вашей системе.
  3. Имейте сценарий, download.php или любой другой, получите идентификатор файла, проверьте, кто вошел в систему, и, если все получится, загрузите файл, прочитайте его в браузере и отправьте соответствующие заголовки загрузки.

Эти заголовки будут выглядеть примерно так:

header('Content-type: application/octet-stream');
header('Content-disposition: attachment; filename=usersuppliedname.txt');
header("Content-Length: " . filesize('../safefiles/1.txt'));
header("Content-Transfer-Encoding:  binary");
readfile('../safefiles/1.txt');
exit;

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

...