出于安全目的,我将文件存储在 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 目录之外的文件的特定文件下载访问权限?我知道我以前在其他脚本上见过它......
您可以使用“php 下载处理程序”来执行此操作:
您可以使用这样的方法将文件内容和文件信息头返回到用户浏览器,只需确保在此之前没有输出任何其他内容即可。
我建议您将其放入单独的文件中并调用它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 );
}
Warning:
这是基本示例,没有考虑到用户可能会尝试利用某些邪恶的优势$_GET
没有经过适当消毒。
这基本上意味着用户可以检索passwd
文件或一些其他敏感信息(如果某些条件适用)。
例如,检索/etc/passwd
:
只需将浏览器指向http://server.com/download.php?file=../../../etc/passwd
服务器返回该文件。因此,在真正使用之前,您应该了解如何正确检查和清理用户提供的任何参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)