我有一个用户将通过paypal,clickbank和paydotcom购买的文件。我必须在我的服务器上托管文件的下载页面。
我已将文件放在public_html文件夹之外的目录中。该文件夹与public_html处于同一级别,例如名为“download”。
下面的脚本应该这样做,但我有两个问题......
1)它似乎不太安全。只需检查查询字符串上的付款确认令牌?
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 f.e. "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之外。我需要获得一个级别的引用,以指向包含下载文件的目录。
另外,正如我之前所说,我不知道如何做到这一点(除了以安全的方式检查预期的查询字符串值)
提前致谢!
答案 0 :(得分:0)
您只需将路径视为普通目录路径,而不是Web路径。所以要简单地“../”,例如
如果您的结构是这样的
/path2file/inhere.pdf /public_html/download.php
文件的路径只是来自download.php“../ path2file / inhere.pdf”
答案 1 :(得分:0)
如果public_html
是您的文档根目录,那么您应该能够获得下载的路径
realpath($_SERVER[DOCUMENT_ROOT].'/../download');
答案 2 :(得分:0)
您可以在../
或dirname
功能中使用父目录快捷方式$path
,如:
$parent_dir = dirname( dirname( __FILE__ ) );
// first dirname is the directory of this file, second goes up one level, etc.
BTW,小心指出URL中的路径,可以通过将其更改为download.php?download_file=../../private/bank_certificate.pem
来读取其他文件(如配置文件或ohter私有文件)。您应该使用realpath
获取文件的绝对路径,并将其与“授权下载”文件列表进行比较。
答案 3 :(得分:-1)
现在,对于文件下载脚本,自定义编码可能不是最佳解决方案。查看具有文件下载模块的Drupal,它也可以与Clickbank模块集成: http://drupal.org/project/clickbank_ipn