PHP-скрипт получает доступ к каталогу, который в противном случае «запрещен всем» (через .htaccess)

Я пытаюсь получить php-скрипт для отображения содержимого каталога резервных копий, защищенного с помощью команды «запретить все» в файле .htaccess.

Причина, по которой это плагин резервного копирования для WordPress, доступна только администраторам, и я хотел бы дать пользователю с более низким рейтингом возможность загружать свои резервные копии из Интернета (через простой виджет панели инструментов).

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

//define the directory (this is where the backup plugin store the .zip files)
$directory = site_url() . "/wp-content/backups/";

//display the generated directory for testing
echo '<b>Scanning: </b>' . $directory . '</br></br>';

//display a link to a test.zip I know exists for testing
echo '<b>Manual Link: </b> <a href="' . $directory . 'test.zip" target="_blank">test.zip</a></br></br>';

//get all files in the directory with a .zip extension.
$files = glob($directory . "*.zip");

//print each file name as a download link
foreach($files as $file){
    echo '<a href="' . $file . '">' . $file . '</a> </br>';
}

Любая помощь, которую вы могли бы оказать, была бы очень полезной.

Спасибо, Энди.

Обновите код, чтобы glob работал правильно

//Define the backup folder location
$backup_location = "wp-content/backups/";

//Set the file directory for glob
$directory = $_SERVER['DOCUMENT_ROOT'] . $backup_location;

//Prints the directory for testing purposes
echo '<b>Scanning: </b>' . $directory . '</br></br>';

//Filter the discovered files
$files = glob($directory . "*.*");

//Echo the filtered files
foreach($files as $file){
    echo '<a href="' . site_url() . '/' . $backup_location . basename($file) . '">' . basename($file) . '</a> </br>';
}

person Andy Cheeseman    schedule 04.12.2011    source источник
comment
Это переменная WordPress, которая возвращает URL-адрес сайта (определенный в бэкэнде WP). Хотя из других комментариев кажется, что glob не работает через URL-адреса.   -  person Andy Cheeseman    schedule 04.12.2011
comment
Да, это правда, glob не работает через HTTP. Вместо этого используйте локальный путь. htaccess не ограничивает доступ через файловую систему, так что проблем быть не должно.   -  person Dr.Molle    schedule 04.12.2011


Ответы (2)


В настоящее время вы просто предоставляете ссылки на файлы, к которым у пользователя нет доступа. Это не будет работать без добавления каких-либо прав.

Что будет работать в этой настройке, так это фактически предоставлять файлы пользователю, используя вашу текущую страницу.

Что вы в основном делаете, так это заставляете php читать файл (у него есть доступ к этому файлу), отправлять пользователю заголовок, а затем содержимое. Используйте код, подобный примеру из руководства по php:

http://php.net/manual/en/function.readfile.php

<?php
$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>
person Nanne    schedule 04.12.2011
comment
Спасибо. Поскольку я генерирую имена файлов на основе того, что возвращает glob, может быть более одного файла. Как бы я использовал этот скрипт для отображения ссылки для скачивания? - person Andy Cheeseman; 04.12.2011
comment
Я бы использовал первый скрипт для создания ссылок, но свяжу их с файлом с вышеприведенным скриптом и параметром get (/site/downloadfile.php?file=yourfilename). сделайте некоторые проверки, чтобы убедиться, что только те файлы, которые вы хотите, могут быть обслужены, но в конце используйте $file = $_GET['file'], чтобы получить имя вашего файла. - person Nanne; 04.12.2011

Ваша проблема заключается в следующем:

 $directory = site_url() . "/wp-content/backups/";

Вы не можете делать списки каталогов через HTTP. Это не работает (независимо от ограничений доступа). Вам нужно запустить glob() и т. д. в локальных каталогах.

 $directory = "./wp-content/backups/";

На странице руководства glob так и написано:

Примечание. Эта функция не будет работать с удаленными файлами, поскольку проверяемый файл должен быть доступен через файловую систему сервера.

person mario    schedule 04.12.2011
comment
Спасибо. Я изменил свой код, чтобы отразить это поведение. Это не решает проблему доступа, но мешает мне ложно утверждать, что в противном случае код будет работать;) (см. обновление по почте Q для кода) - person Andy Cheeseman; 04.12.2011
comment
Нет, идея, что вы говорите. Но прямые ссылки для загрузки, очевидно, не будут работать, если вы не реализуете оболочку доступа, как объяснил #Nanne. - person mario; 04.12.2011