Принудительно скачать файл - PullRequest
0 голосов
/ 06 марта 2011

Я занимаюсь разработкой веб-сервиса. С помощью этой службы пользователь загружает свои .php файлы, а служба удаляет символы спецификации UTF8 из php-файла. И тогда, там будет ссылка, как это:

<a href="uploads/as8df7/uploadedfile.php">Download Your File</a>

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

Есть идеи?

(P.S. Я не хочу изменять файл uploadedfile.php , также я прочитал 5 вопросов по этому поводу, но все же у меня проблема.)

Ответы [ 3 ]

4 голосов
/ 06 марта 2011

Вам необходимо указать этот HTTP-заголовок:

Content-Disposition: attachment; filename=example.txt

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

1 голос
/ 06 марта 2011

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

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

URL для такого скрипта будет выглядеть так:

http://www.example.com/get_uploaded_file.php?id=jgh3h8gjdj2389

Это связало бы значение в id с файлом на сервере, и если вы сохранили оригинальное имя файла (плоский файл, БД), вы можете использовать его, используя его оригинальное имя, при условии, что вы установите правильные заголовки HTTP.

0 голосов
/ 20 августа 2013

Прямая ссылка на файл PHP может привести к его выполнению.Одним из способов является (как кто-то выше предложил) переименовать его.Или, у вас может быть downloader.php, который работает ниже:

<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 01 Jan 2000 01:00:00 GMT'); // some date in past
header('Content-type: text/plain');
header('Content-Disposition: attachment; filename='.basename($filepath));
header('Content-Length: ' . filesize($filepath));
flush(); // or any other flush function/mechanism you use.
readfile($filepath);

и связывает его примерно так: <a href="./downloader.php?fileid=4ba213">Download</a>

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

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