我使用以下代码来保护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的新手。 感谢
答案 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函数需要一个完整的文件系统路径才能工作(而不仅仅是相对路径)。