Разрешить пользователям загружать файлы вне webroot - PullRequest
5 голосов
/ 07 октября 2010

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

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

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

Есть ли у нас решение или это загружаемые папки должны быть дочерними каталогами webroot?

<?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: / или веб-сервер. Так что не должно быть проблем с доступом.

Ответы [ 3 ]

9 голосов
/ 07 октября 2010

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

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

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

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

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

1 голос
/ 07 октября 2010

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

0 голосов
/ 14 марта 2013

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

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