Intereting Posts
Magento 1.9.2.1 настраиваемый модуль 404 Как проверить дублирующее письмо перед отправкой в ​​php-файл Невозможно установить / find detect_unicode на Off Диакритический бесчувственный поиск mysql? Google Oauth для YouTube: почему я получаю код «Undefined index: oauth_token» (код Jim S.) Как заставить CakePHP выпекать, чтобы найти mysql.sock и распознать MySQL при использовании MAMP на Mac OSX? как узнать, какой конкретный процесс все еще работает в PHP Устранение неполадок, преобразовывающих зависание POST из командной строки в php Gearman: до сих пор нет способа получить пользовательские данные от фонового работника? Установить переменную сеанса с помощью javascript preg_replace non-alpha, оставить одиночные пробелы возможно ли, если обратный вызов в параметре array_filter принимает параметр? Передача массива с одной страницы на другую php $ _POST массив пуст после отправки формы Вызовите веб-службу Python с помощью PHP

Разрешить пользователям скачивать файлы за пределами webroot

Привет, я использую PHP, чтобы пользователи могли загружать файлы, и я их сижу в папке вне webroot (/ var / www) по соображениям безопасности. Он находится в папке / var / uploads. Пользователь загружает файлы для определенных записей. Как только загруженные файлы будут перемещены в папку uploads, адрес вложения будет сохранен в базе данных. Теперь, когда пользователь проверяет запись, вложения для конкретной записи будут отображаться для загрузки.

Поскольку они находятся вне webroot, я не могу загрузить их, поскольку у них будет URL-адрес

Http: //localhost/var/uploads/attachment.txt

У нас есть решение или должны ли загружаемые папки быть дочерними каталогами веб-сайта?

<?php $con = mysql_connect("localhost","id","pass"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("db", $con); $result = mysql_query("select * from attachments"); while($row = mysql_fetch_array($result)) { echo '<a href="'.$row[2].'" target="_blank">Download</a>--'.$row[3].'<br>'; } mysql_close($con); ?> 

это код, который я использую. Владелец папки – www-data: / или веб-сервер. Таким образом, не должно быть проблем с доступом.

использование

  • символическая ссылка, указывающая на /var/uploads (учебник здесь )

  • директива Alias /uploads /var/uploads Alias Alias /uploads /var/uploads (должна быть в httpd.conf)

  • или прокси-скрипт PHP, который принимает переменную GET filename=upload.jpg и извлекает файл, например, используя fpassthru()

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

Вы можете просто иметь файл php, который отображает содержимое файла в ответ, и соответствующим образом задает тип mime.

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