如何保护php文件和下载文件链接

时间:2014-02-05 13:12:06

标签: php .htaccess

我使用以下代码来保护zip文件的直接下载链接

<?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代码或输入wring代码时没有输入id,服务器会发送一些错误,指出找不到指定的文件。但该文件揭示了文件的实际位置。在这种情况下如何保护php文件。我能在htaccess文件中做些什么吗?

我是php的新手。 感谢

2 个答案:

答案 0 :(得分:2)

最好我认为如果你从apache文档根目录中移出目录(如果可以的话) 或者您也可以在目录/ .htaccess

中禁用.htaccess目录

拒绝所有

就像这里:deny direct access to a folder and file by htaccess

如果您想隐藏错误消息,可以在php(或函数前的@符号)中使用error_reporting(0) 或者只是使用file_exists(...)

检查文件

但首先你需要解析输入数据以确保安全性, 因为如果你有这样的网址:?id = .. / .. / filename任何人都可以从你的服务器下载任何文件

例如,你必须从输入中删除至少..字符串:

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

如果你不这样做,蚂蚁$ _GET ['id'] =='../filename.ext',而你的$ path将是'directory /../ filename.ext',这个可能很危险

答案 1 :(得分: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();
}

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