PHP禁用除拥有帐户的人以外的所有人的下载

时间:2014-09-07 17:50:37

标签: php

我正在开发一个系统,允许拥有帐户的下载文件, 现在我遇到了从每个人和所有地方禁用下载的问题, 所以任何提示或选项都会比你更有用

我的代码:

global $AllowDownload = false;

function Connect()
{
    $Connect = mysqli_connect("127.0.0.1", "root", "12345", "film");

    if (mysqli_connect_errno())
        echo mysqli_connect_error();

    return $Connect;
}

function IsValid($Username, $Password)
{
    $IsValid = false;

    $Query = mysqli_query(Connect(), "SELECT COUNT(*) FROM `account` WHERE `username` = '$Username' AND `password` = '$Password'");
    $Check = mysqli_fetch_array($Query);

    if ($Check[0])
        $IsValid = true;

    return $IsValid;
}

if (!isset($_SERVER['PHP_AUTH_USER']))
{
    header('WWW-Authenticate: Basic');
    header('HTTP/1.0 401 Unauthorized');
    exit();
}
else
{
    $Username = mysqli_real_escape_string(Connect(), $_SERVER['PHP_AUTH_USER']);
    $Password = mysqli_real_escape_string(Connect(), $_SERVER['PHP_AUTH_PW']);

    if (IsValid($Username, $Password))
    {
        $AllowDownload = true;
    }
    else
    {
        header('HTTP/1.0 401 Unauthorized');
    }
}

2 个答案:

答案 0 :(得分:1)

您的PHP脚本必须首先作为文件代理工作。您可以使用查询参数将请求的文件传递给脚本,例如。 proxy.php?file=myfile.jpg。这非常讨厌,您可以使用.htaccess文件来大大改善它。

非常简单的文件代理的快速草图可能如下所示:

<?php
  /* authorize user here */

  if(!$authorized) die("No content for you!");
  else {
    header("Content-Type: application/octet-stream");
    readfile($_GET["file"]);
  }
?>

但是,您应该知道,这样,客户可以访问您托管中的每个文件。因此,您应确保确实要提供该文件(至少要确保用户不要尝试使用../之类的内容更改目录。

请检查您的Connect功能。它可能适用于mysqli(自从我使用PHP以及特别是这些低级函数以来已经很久了),但它仍然非常讨厌。包装你的连接并形成某种单例模式肯定会更好 - 就像这样:

$connection = false;
function connect() {
  global $connection;
  if(!$connection) {
    // connect here
  }

  return $connection
}

(这当然不是一个正确实现的单例 - 但它确保连接只被初始化一次)

答案 1 :(得分:0)

这可以通过以下代码块完成。将代码块放在可下载的有效条件块中。

if($AllowDownload)
{
    $file = "/your/file/fullpath/filename.jpg";
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}

确保真实文件存在于公共html目录之外。