回答
在有一点你必须给浏览器一个真正的URI,以便它能够获取文件。 试图隐瞒它是毫无意义的。
我不相信这是真的。有一种简单的方法可以使用PHP的fpassthru来保护服务器上的文件免受无特权的下载。如果你有一个叫做的download.php文件,其内容如下:?
<?php
/**
* Make sure the downloads are *not* in a publically accessible path, otherwise, people
* are still able to download the files directly.
*/
$filename = '/the/path/to/your/files/' . basename($_GET['filename']);
/**
* You can do a check here, to see if the user is logged in, for example, or if
* the current IP address has already downloaded it, the possibilities are endless.
*/
if(file_exists($filename)) {
/**
* Send some headers indicating the filetype, and it's size. This works for PHP >= 5.3.
* If you're using PHP < 5.3, you might want to consider installing the Fileinfo PECL
* extension.
*/
$finfo = finfo_open(FILEINFO_MIME);
header('Content-Disposition: attachment; filename= ' . basename($filename));
header('Content-Type: ' . finfo_file($finfo, $filename);
header('Content-Length: ' . filesize($filename));
header('Expires: 0');
finfo_close($finfo);
/**
* Now clear the buffer, read the file and output it to the browser.
*/
ob_clean();
flush();
readfile($filename);
exit;
}
header('HTTP/1.1 404 Not Found');
echo "<h1>File not found</h1>";
exit;
你可以调用的download.php与文件名= test.foo,它会下载/的/路径/要/你/files/test.foo,这是不公开的。
直到它们传递'?filename = ../../../../../../etc/passwd' ... – 2011-06-16 09:06:40
为这段代码添加一些理智检查。否则,一个好的答案。 – 2011-06-16 09:10:48
@Ignacio:刚刚注意到:'basename(“../../../../../../../ etc/passwd”)'返回'passwd',而不是'/ etc/passwd' 。 – 2011-06-16 09:14:21
在某些时候,您将不得不为浏览器提供真正的URI,以便获取文件。试图隐瞒它毫无意义。
如果您想限制谁可以访问它,请在允许访问下载之前设置某种时间有限的凭据并进行身份验证。
将浏览器指向PHP脚本,而是传递代表要下载的文件名的密钥。解码密钥,并send the file via the PHP script。
是的,您可以使用JavaScript重定向用户,当他们点击导致'#'的链接时,例如
<a href="#">Secret File</a>
然而,这是没有意义的,因为它永远是可以跟踪正在下载什么文件(通过使用HTTP嗅探器,例如,或其他工具)。从本质上讲,你要求的是不可能和不合理的。
如果您需要确保文件仅由某些人访问,请让他们登录并在向他们提供数据前检查凭据。隐藏这条道路并不是要走的路。
是的,你是对的。 – fawad 2011-06-16 09:00:51
像其他人士指出,在某些时候,你必须显示的URL,但是如果你想要做的是从状态栏隐藏它,你可以这样做:
<a href="http://example.org" onmouseover="window.status='Add something here.'; return true;" onmouseout="window.status=''; return true;">Description</a>
谢谢,这也是一个非常好的方法。 – fawad 2011-06-16 09:00:37
在FireFox中按CTRL + U。 – 2011-06-16 09:12:10
Before Passing FilePath it to download_file() fucntion. Append the path to file id. Like Below.
$FilePaths='../Uploaded Files/'.$FilePath;
download_file($FilePaths);
function download_file($fullPath)
{
// Must be fresh start
if(headers_sent())
die('Headers Sent');
// Required for some browsers
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
// File Exists?
if(file_exists($fullPath)){
// Parse Info/Get Extension
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
// Determine Content Type
switch ($ext) {
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
ob_clean();
flush();
readfile($fullPath);
}
else
die('File Not Found');
}
- 1. 如何设置下载路径并获取下载路径?
- 2. 如何将文件下载到所需的文件夹/路径?
- 3. 隐藏或加密文件路径(src)
- 4. PHP文件下载路径太长
- 5. ftp文件下载路径有问题?
- 6. 加载HTML使用加载根文件的路径的相对路径,而不是源文件的路径
- 7. 如何在没有servlet的下载路径下从浏览器下载文件
- 8. 从类路径加载类文件
- 9. 通过路径加载XML文件
- 10. 加载绝对路径的json文件
- 11. Webpack文件加载器:重写路径
- 12. 如何获取下载文件的完整路径
- 13. 如何使用URL路径作为文件名下载?
- 14. 如何使用私人路径下载DownloadManager的文件?
- 15. 如何解决VBScript中的文件下载路径错误?
- 16. 如何将下载的文件保存到指定的路径?
- 17. 如何下载物理路径中的空Excel文件
- 18. 如何使用php下载文件,提供的路径已知
- 19. 如何下载文件并在本地获取路径位置
- 20. 如何设置Epub文件的下载路径
- 21. 如何指定使用python下载的文件路径
- 22. C# - 读取文件下载的本地下载路径
- 23. 如何确定 - [UIImage imageNamed:]将加载的文件的路径?
- 24. 如何从Ruby中的特定相对路径加载文件?
- 25. 如何加载相对于模块路径的文件?
- 26. 如何配置加载webpack的字体的文件路径?
- 27. 如何从BIRT上的类路径自动加载JS文件
- 28. 如何查找加载表的文件路径?
- 29. 如何使用Java ClassLoader从类路径加载文件?
- 30. 自动 - 下载加密文件
不。总有一种方法可以找出你从哪里下载文件(例如检查HTTP头文件)。你为什么想这样做? – 2011-06-16 08:50:33
我不希望用户直接访问文件,如果下载链接是文件名MP(1).pdf,那么它表示该文件夹将有MP(2).pdf,MP(3).pdf,我不想要我的客户访问其他文件。 – fawad 2011-06-16 08:57:56
然后通过PHP脚本(如@Ignacio建议)提供文件并将文件存储在Web根目录之外。 – 2011-06-16 08:59:54