我正在开发一个系统,允许拥有帐户的下载文件, 现在我遇到了从每个人和所有地方禁用下载的问题, 所以任何提示或选项都会比你更有用
我的代码:
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');
}
}
答案 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目录之外。