Скачайте PHP скрипт вместо того, чтобы его выполнять - PullRequest
2 голосов
/ 25 декабря 2009

У меня есть каталог downloads на веб-сайте, где я храню кучу разных файлов для скачивания людьми (zip, exe, java, php и т. Д.). Проблема в том, что мой сайт написан на PHP, поэтому веб-сервер Apache пытается выполнить сценарии, вместо того, чтобы позволить людям загружать их. Если у вас нет доступа к конфигурации Apache (я использую общий хостинг), как проще всего запретить Apache выполнять сценарии в одном каталоге?

Я попытался использовать mod_mime безуспешно. AddType не работает, потому что (я предполагаю) MIME-тип уже связан с PHP-скриптами. ForceType не работает, потому что я храню разные типы файлов в каталоге. Есть ли другие варианты?

Ответы [ 5 ]

13 голосов
/ 25 декабря 2009

Если у вас достаточно прав для этого, поместите следующую строку в файл .htaccess в каталоге, в котором вы не хотите, чтобы PHP-скрипт выполнялся, могли бы добиться цели:

php_flag engine off

(только что протестировано на моем веб-сервере, и я получил исходный скрипт PHP - который не был выполнен)

5 голосов
/ 25 декабря 2009

Вы можете написать отдельный скрипт PHP, который отправляет правильный заголовок Content-type и затем использует readfile() для передачи содержимого файла PHP без фактического их выполнения PHP (а поскольку Apache уже передал запрос PHP, это уже не волнует). Просто убедитесь, что вы ограничиваете его обслуживанием только из этого каталога.

3 голосов
/ 25 декабря 2009

Я думаю, что общее решение этого вопроса - дать файлам расширение phps.

2 голосов
/ 25 декабря 2009

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

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

Тогда используйте:

<?php
$file = trim(isset($_GET['file']) ? $_GET['file'] : '');

$allow = array(
    'foo.php' => 'text/plain',
    'foo.jpg' => 'image/jpeg',
);    

if(! isset($allow[$file]))
   die('File not found.');

header('Content-Type: ' . $allow[$file]);
readfile($file);
2 голосов
/ 25 декабря 2009

Я думаю, у меня есть решение для вас. Проверьте это:

http://www.boutell.com/newfaq/creating/forcedownload.html

По сути, это говорит о том, что на вашей php-странице должен быть следующий код:

<?php
header('Content-disposition: attachment; filename=whatever.php');
header('Content-type: text/html');
readfile('whatever.php');
?>

Я сделал образец здесь:

http://sotkra.com/test.php

Это вынуждает запросить файл загрузки, где файл загружается в what.php

Приветствия

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