Php readfile - принудительная загрузка - PullRequest
4 голосов
/ 20 июня 2010

Я использую флэш-плеер для воспроизведения некоторых mp3-файлов.В Firefox он загружает их нормально, а в IE - нет.Когда я иду к URL-адресу файла .mp3, он показывает исходный код mp3 (вместо предложения, например, скачать).Поэтому я использовал небольшой скрипт, чтобы исправить это:

$url = $_GET['url'];
header('Content-type: application/force-download');
header('Content-Transfer-Encoding: Binary');
header("Content-disposition: attachment; filename=demo.mp3");
readfile($url);

Я хотел бы спросить вас, безопасно ли это.Кроме того, сервер теряет пропускную способность таким образом?И, наконец, влияет ли это на ресурсы сервера?Спасибо.

Ответы [ 4 ]

9 голосов
/ 20 июня 2010

Нет, это не безопасно. Если у вас был пароль вашей базы данных в database.php и я ввел database.php как $_GET['url'], ваш скрипт отправил бы мне этот файл PHP с вашим паролем.

Да, это будет использовать пропускную способность и некоторые ресурсы сервера.

5 голосов
/ 20 июня 2010

Это небезопасно, и вам не нужно делать это таким образом.

В дополнение к последствиям для безопасности @ceejayoz обрисовывает в общих чертах, если включена опция PHP allow_url_fopen, онаможно вставить любой URL в $url.Таким образом, ваш сервер может быть легко использован для потоковой передачи больших объемов данных с других серверов со всеми видами последствий.

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

В любом случае это не должно быть необходимо в вашем случае.Похоже, ваш веб-сервер не обслуживает правильный заголовок content-type вместе с вашими файлами MP3.Это то, что вы должны исправить.

Возможно, если вы используете Apache, добавьте файл .htaccess в каталог, в котором находятся файлы MP3 со следующим содержимым:

AddType audio/mpeg .mp3

ужеустраняет проблемуЕсли это не так, но force-download работает, попробуйте

AddType application/force-download .mp3
2 голосов
/ 20 июня 2010

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

Если вы обслуживаете их напрямую с веб-сервера без сценария, вам просто нужно настроить содержимоевведите конфигурацию вашего веб-сервера.

Для Apache вы можете настроить это в файле .htaccess:

AddType audio/mpeg .mp3
1 голос
/ 20 июня 2010

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

Хотя при этом будут использоваться пропускная способность и ресурсы сервера, это будет минимально больше, чем загрузка файлов регулярно.Единственная дополнительная нагрузка - это обработка / запуск PHP.Вы, вероятно, не заметите разницу.

...