У меня есть файлы, хранящиеся вне папки public_html в целях безопасности. Тем не менее, я хотел бы как-то связать конкретные файлы, где пользователь мог бы загрузить один из этих файлов.
Я использую сценарий jquery, который позволяет мне указать сервер PATH в качестве папки для загрузки, и он загружается за пределы папки public_html.
Единственная проблема заключается в том, что мне требуется указать URL-адрес «пути загрузки», который используется для загрузки файлов. Я думал, что смогу что-то вроде:
public_html/redirect (contains htaccess which forwards all requests to "hiding" folder) hiding (outside public_html) A user clicks /redirect/file.doc and they download a file located at hiding/file.doc
Это возможно? Если нет, как я могу предоставить определенный доступ к файлам для скачивания файлов вне моего каталога public_html? Я знаю, что видел это на других сценариях раньше …
Вы можете использовать такой метод, чтобы вернуть содержимое файла и заголовки информации о файлах в браузер пользователей, просто убедитесь, что перед этим ничего не выводится.
Я предлагаю вам поместить это в отдельный файл и вызвать его, например download.php
.
function returnFile( $filename ) { // Check if file exists, if it is not here return false: if ( !file_exists( $filename )) return false; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); // Suggest better filename for browser to use when saving file: header('Content-Disposition: attachment; filename='.basename($filename)); header('Content-Transfer-Encoding: binary'); // Caching headers: header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); // This should be set: header('Content-Length: ' . filesize($filename)); // Clean output buffer without sending it, alternatively you can do ob_end_clean(); to also turn off buffering. ob_clean(); // And flush buffers, don't know actually why but php manual seems recommending it: flush(); // Read file and output it's contents: readfile( $filename ); // You need to exit after that or at least make sure that anything other is not echoed out: exit; }
// Added to download.php if (isset($_GET['file'])) { $filename = '/home/username/public_files/'.$_GET['file']; returnFile( $filename ); }
Это основной пример и не учитывает, что пользователь может попытаться воспользоваться некоторыми злобными преимуществами $_GET
которые должным образом не дезинфицируются.
Это означает, что в основном пользователь может, например, извлечь файл passwd
или другую конфиденциальную информацию, если применяются определенные условия.
Например, извлечение /etc/passwd
:
Просто укажите браузер на http://server.com/download.php?file=../../../etc/passwd
и сервер вернет этот файл. Поэтому перед реальным использованием вы должны выяснить, как правильно проверять и дезинформировать любые аргументы, предоставленные пользователем.
Это невозможно для путей вне public_html
.
mod_rewrite
только перезаписывает запрос, но путь все равно должен быть доступен для пользователей.
Другой стандартный способ сделать это – использовать файл mod_xsend – это позволит веб-приложению, чтобы веб-сервер отправил файл в качестве своего вывода, указав путь в заголовке (X-SendFile).