2014-02-05 74 views
0

我使用下面的代码保护的zip文件如何保护PHP文件和下载文件链接

<?php 
$filename = $_GET["id"]; 

$path = "directory/{$filename}.zip"; 

$mm_type="application/octet-stream"; 

header("Pragma: public"); 

header("Expires: 0"); 

header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 

header("Cache-Control: public"); 

header("Content-Description: File Transfer"); 

header("Content-Type: " . $mm_type); 

header("Content-Length: " .(string)(filesize($path))); 

header('Content-Disposition: attachment; filename="'.basename($path).'"'); 

header("Content-Transfer-Encoding: binary\n"); 

readfile($path); 

exit(); 

?> 

直接下载链接是对代码足以保护直接下载链接。我不希望链接通过IDM或其他下载管理器可见。

现在如果我在调用上面的php代码时没有输入id或者输入扭曲代码,服务器会发送一些错误的php文件,指出找不到指定的文件。但该文件揭示了文件的实际位置。在这种情况下如何保护php文件。有什么我可以在htaccess文件中做的吗?

我是php新手。 谢谢

+0

为什么有人知道这个位置很重要?如果你想保护访问,那么要求认证将是一个更好的选择。如果您不希望人们在不通过脚本的情况下下载文件,则该文件本身应该位于网络空间之外。 – cHao

回答

0

我建议修改您的现有代码,以便一旦你建立了文件名,你检查文件是否存在,如果不提供HTTP 404错误。

这里有一个改变了代码的一个粗略的轮廓上述工作由:

$path = "directory/{$filename}.zip"; 
if(!file_exists($root . '/' . $path)) { 
    header('HTTP/1.0 404 Not Found'); 
    echo "<h1>404 Not Found</h1>"; 
    echo "The page that you have requested could not be found."; 
    exit(); 
} 

你会注意到,我在里面加了$根变量。这需要使用站点文档根目录的完整路径进行设置,因为file_exists函数需要完整的文件系统路径才能工作(不仅仅是相对路径)。

+0

我尝试了像http:// localhost/ (在xampp上使用)的完整路径,但file_exist函数总是返回false。没有明白为什么? – user3185333

+0

因此,您要查找的路径不是域,或者“本地主机”是您的服务器存储中文件本身所在的位置。因此,在Unix下,这可能类似于/ var/www/sitename/htdocs /或在Windows上它可能是D:/ websites/sitename/documents /等。 您可以通过使用预设$ _SERVER变量 - 但这并不总是准确的。尝试用$ _SERVER ['DOCUMENT_ROOT']替换$ root,看看它是否有帮助。 – steve

2

最好的,我想如果你从Apache文档根目录移出该目录(如果你能) 或者你可以在目录/的.htaccess

太禁用与.htaccess中的目录从所有

否认

喜欢这里:deny direct access to a folder and file by htaccess

,如果你想隐藏的错误信息,您可以使用的error_reporting(0)你PHP(或函数之前@符号) 或只是检查与file_exists的文件(...)

但首先你必须分析你的输入数据的安全性, 因为如果你的URL是这样的:ID = ../.. /文件名任何人都可以从你的服务器

下载任何文件,例如,你必须至少去除..从输入字符串:

$filename = str_replace('..', '', $filename); 

如果不这样,蚂蚁$ _GET [“身份证”] ==“../filename.ext”,比你$路径是怎么回事成为'directory /../ filename.ext',这可能是危险的

+0

感谢好友 请你详细解释最后一行关于解析输入数据的问题。我没有得到... PLZ。 – user3185333

+0

完成。如果你在/ var/www /和你的路径是'$ path ='dir /'。 $ filename'但是'$ filename =='../../../ etc/passwd''那么用户将拥有你的/ etc/passwd文件 – feco