Php 安全下载链接

Php 安全下载链接,php,Php,我试图为经过身份验证的用户提供对其报告的访问权限。 我使用以下代码创建(取决于登录用户)如下链接: echo "<a href = 'http://127.0.0.1:8080/reports.php?file=XXXXXX.html'>Download Report Januar</a>"; 我注意到一些安全问题: 您可能希望通过https提供下载链接 您不希望基于本质上未经检查的$\u GET变量链接到任何文件 您可能希望进一步限制用户使用某些文件,而不是授予他们

我试图为经过身份验证的用户提供对其报告的访问权限。 我使用以下代码创建(取决于登录用户)如下链接:

echo "<a href = 'http://127.0.0.1:8080/reports.php?file=XXXXXX.html'>Download Report Januar</a>";

我注意到一些安全问题:

  • 您可能希望通过https提供下载链接
  • 您不希望基于本质上未经检查的$\u GET变量链接到任何文件
  • 您可能希望进一步限制用户使用某些文件,而不是授予他们下载给定目录中任何文件的打开权限

我注意到一些安全问题:

  • 您可能希望通过https提供下载链接
  • 您不希望基于本质上未经检查的$\u GET变量链接到任何文件
  • 您可能希望进一步限制用户使用某些文件,而不是授予他们下载给定目录中任何文件的打开权限

那么,文件是以用户名命名的吗?不,XXX仅用于匿名我的数据。那么,文件是以用户名命名的吗?不,XXX仅用于匿名我的数据。我不理解最后两条评论。服务器上的文件属于用户“www数据”。Web服务器上不存在实际验证和下载文件的用户(将有许多用户)。我将为每个用户创建他的下载列表。使用?file=filename.html。当然,这些联系是可以猜测的。因此,没有权限的用户将因“对不起,您的类型不是我的类型”而死亡。从我的角度来看,不安全的部分是44ahj34k578adfhq238iqdn7VB-目录,它可能受到暴力攻击。任何通过$\u GET变量进行的操作都是不安全的。例如,我可能会尝试使用类似于以下内容的内容进行目录遍历攻击:您当前的实现是否能够抵御它?我相信它会通过你现在的preg_match regex。此外,正如我上一次提到的,这将使用户能够下载该目录中的任何文件(您可能会觉得可以接受,也可能不会觉得可以接受)。我建议您不要过于重视隐蔽性带来的安全问题。考虑到你的站点的用户知道你的服务器上的每个文件/目录名,并确保他们仍然无法得到你不希望他们得到的任何东西。添加一些东西是个好主意。如果(user=authenticateduser)和(filename=filenameuserisupposedtodownload),则进行下载。这是一个很好的观点。我不理解最后两条评论。服务器上的文件属于用户“www数据”。Web服务器上不存在实际验证和下载文件的用户(将有许多用户)。我将为每个用户创建他的下载列表。使用?file=filename.html。当然,这些联系是可以猜测的。因此,没有权限的用户将因“对不起,您的类型不是我的类型”而死亡。从我的角度来看,不安全的部分是44ahj34k578adfhq238iqdn7VB-目录,它可能受到暴力攻击。任何通过$\u GET变量进行的操作都是不安全的。例如,我可能会尝试使用类似于以下内容的内容进行目录遍历攻击:您当前的实现是否能够抵御它?我相信它会通过你现在的preg_match regex。此外,正如我上一次提到的,这将使用户能够下载该目录中的任何文件(您可能会觉得可以接受,也可能不会觉得可以接受)。我建议您不要过于重视隐蔽性带来的安全问题。考虑到你的站点的用户知道你的服务器上的每个文件/目录名,并确保他们仍然无法得到你不希望他们得到的任何东西。添加一些东西是个好主意。如果(user=authenticateduser)和(filename=filenameuserisupposedtodownload),则进行下载。这是一个很好的观点。
$dir = '/var/www/html/44ahj34k578adfhq238iqdn7VB/';
$type = 'text/html';


if(!empty($_GET['file']) && !preg_match('=/=', $_GET['file'])) {
    if ($_SESSION['username'] == 'XXXXX') {
            if(file_exists ($dir.$_GET['file']))     {
            makeDownload($_GET['file'], $dir, $type);
        } 
    } else {
        die("sorry, but you are not my type.");
    }
}


function makeDownload($file, $dir, $type) {

    header("Content-Type: $type");
    header("Content-Disposition: attachment; filename=\"$file\"");
    readfile($dir.$file);
}

// File permissions:
    // drwxr-xr-x 2 www-data root      4096 Mar 27 10:12 44ahj34k578adfhq238iqdn7VB
    // -rw-r--r-- 1 www-data root 5056 Mar 27 10:13 XXXXX.html