【问题标题】:How to protect php files and download file links如何保护php文件和下载文件链接
【发布时间】:2014-02-05 13:12:06
【问题描述】:

我正在使用以下代码来保护 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 文件,其中包含一些错误,指出未找到指定的文件。但该文件揭示了文件的实际位置。在这种情况下如何保护 php 文件。我可以在 htaccess 文件中做些什么吗?

我是 php 的新手。 谢谢

【问题讨论】:

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

标签: php .htaccess


【解决方案1】:

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

拒绝所有

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

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

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

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

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

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

【讨论】:

  • 谢谢哥们,你能否详细说明一下关于解析输入数据的最后几行。我没有得到......请。
  • 完成。如果您在 /var/www/ 并且您的路径是 $path = 'dir/' . $filename$filename == '../../../etc/passwd' 那么用户将拥有您的 /etc/passwd 文件
【解决方案2】:

我建议修改现有代码,以便在建立文件名后检查文件是否存在,如果不存在则提供 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 函数需要完整的文件系统路径才能工作(而不仅仅是相对路径)。

【讨论】:

  • 我试过像localhost这样的完整路径(在xampp上使用)但是file_exist函数总是返回false。不明白为什么?
  • 因此,您要查找的路径不是域或“本地主机”,而是文件本身在服务器存储上的位置。因此,在 Unix 下,这可能类似于 /var/www/sitename/htdocs/ 或在 Windows 上可能是 D:/websites/sitename/documents/ 等。您可以使用预先设置的 $_SERVER 访问路径变量 - 但这并不总是准确的。尝试将 $root 替换为 $_SERVER['DOCUMENT_ROOT'] 看看是否有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多