Защищенный сценарий загрузки файлов. Почти готово

У меня есть файл, который пользователи будут покупать через paypal, clickbank и paydotcom. Мне нужно разместить страницу загрузки файла на моем сервере.

Я поместил файл в каталог за пределами моей папки public_html. Папка находится на том же уровне, что и public_html и называется «загрузка», например.

Предполагается, что этот сценарий должен сделать это, но у меня есть две проблемы с ним …

1) Это не кажется слишком надежным. просто проверьте токен подтверждения платежа на querystring?

2) Я не могу переменную $ path указывать на папку загрузки, не включая мою общую папку site.com в пути. Например, когда я возвращаю $ path, я получаю

/home/myuser/public_html/mysite.com 

Но мне нужно, чтобы

 /home/myuser/download/myprotectedfile.zip 

Я уверен, что есть более безопасный или умный способ сделать это, поэтому я спрашиваю …

 <?php // place this code inside a php file and call it fe "download.php" $path = $_SERVER['DOCUMENT_ROOT']."/path2file/"; // change the path to fit your websites document structure $fullPath = $path.$_GET['download_file']; if ($fd = fopen ($fullPath, "r")) { $fsize = filesize($fullPath); $path_parts = pathinfo($fullPath); $ext = strtolower($path_parts["extension"]); switch ($ext) { case "pdf": header("Content-type: application/pdf"); // add here more headers for diff. extensions header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download break; default; header("Content-type: application/octet-stream"); header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); } header("Content-length: $fsize"); header("Cache-control: private"); //use this to open files directly while(!feof($fd)) { $buffer = fread($fd, 2048); echo $buffer; } } fclose ($fd); exit; // example: place this kind of link into the document where the file download is offered: // <a href="download.php?download_file=some_file.pdf">Download here</a> ?> 

Проблема, с которой я столкнулась, заключается в том, что значение $ path включает мою ссылку на site.com, но каталог загрузки находится за пределами site.com. Мне нужно получить ссылку на уровень, чтобы указать на каталог, в котором хранится файл загрузки.

Кроме того, как я уже говорил ранее, я не уверен, как это сделать (кроме проверки ожидаемого значения querystring таким образом, чтобы это было безопасно)

Заранее спасибо!

Вы можете использовать ярлык родительского каталога ../ в вашей $path или функции dirname например:

 $parent_dir = dirname( dirname( __FILE__ ) ); // first dirname is the directory of this file, second goes up one level, etc. 

BTW, остерегайтесь указания пути в вашем URL-адресе, можно было бы прочитать другие файлы (например, файлы конфигурации или личные файлы ohter), изменив его на download.php?download_file=../../private/bank_certificate.pem . Вы должны использовать realpath чтобы получить абсолютный путь к файлу и сравнить его с списком файлов «Разрешенные для загрузки».

Вам просто нужно рассмотреть путь, как обычный путь к каталогу, а не веб-интерфейс. поэтому подниматься на уровень просто «../», например

если вы структурируете, как это

/path2file/inhere.pdf /public_html/download.php

путь к файлу будет просто из download.php "../path2file/inhere.pdf"

хорошо, если public_html является вашим корнем вашего doc, тогда вы должны иметь возможность получить путь для загрузки, будет

realpath($_SERVER[DOCUMENT_ROOT].'/../download');

В настоящее время пользовательское кодирование не может быть лучшим решением для сценария загрузки файлов. Посмотрите Drupal, у которого есть модули загрузки файлов, которые также могут быть интегрированы с его модулем Clickbank: http://drupal.org/project/clickbank_ipn