【问题标题】:Allow access to particular file in PHP允许访问 PHP 中的特定文件
【发布时间】:2016-07-12 10:43:53
【问题描述】:

在我的项目中,用户将上传一个 pdf 文件。这将存储在名为“uploads”的目录中,名称为$_SESSION['userId'].".pdf"。现在用户可以使用'myweb.com/uploads/id.pdf' 访问该文件。但是当用户在浏览器的 url 栏中更改 id 值时,他可以访问其他用户的文件。为了防止它,我想使用一个链接将$_SESSION['userId'] 与隐藏类型发布到下一页。在下一页将使用发布的 id 重定向到文件。 这个想法好吗?或者有没有更好的解决方案?

【问题讨论】:

  • 不。因为如果您只是从 URL 中隐藏它,它对您没有帮助。如果用户检查源代码怎么办?考虑一个 ajax 下载,或者更好,如果通过电子邮件发送给他。
  • 检查 isset $_SESSION['userId'] 并将其与 url 中的 id 进行比较
  • @Sree 是的,这将是我的下一个建议,很明显:)
  • 您需要考虑权限 - 在启用下载之前,请检查客户端是否具有这样做的权限(在您的数据库中创建权限表,并将特定文件附加到特定用户)更多信息 - stackoverflow.com/questions/4345322/…
  • 永远不要在文件名中保留敏感信息,而是在文件名中给出带有一些自动递增编号的随机文件名,并针对每条记录存储在数据库中。

标签: php file security session


【解决方案1】:

在 PDF 文件的文件夹中,您必须创建 .htaccess 文件并在其中放置以下两行。

  • 订单拒绝,允许
  • 拒绝所有

此 .htaccess 文件不允许直接从浏览器访问任何 PDF 文件。 要允许登录用户访问 PDF 文件,请创建一个 PHP 文件 downloadpdf.php 并将以下代码放入其中。登录的用户只能通过这种方式下载他/她的文件。

<?php
$pdf_file = "{$_SERVER['DOCUMENT_ROOT']}/path-to-pdf-file/".$_SESSION['userId']".pdf";
if( file_exists( $pdf_file ) )
{
  header( 'Cache-Control: public' );
  header( 'Content-Description: File Transfer' );
  header( "Content-Disposition: attachment; filename={$pdf_file}" );
  header( 'Content-Type: application/pdf' );
  header( 'Content-Transfer-Encoding: binary' );
  readfile( $pdf_file );
  exit;
}
die( "ERROR: invalid song or you don't have permissions to download it." );
?>

【讨论】:

  • 这工作正常。但是这个脚本正在下载文件。我只需要在浏览器本身中打开 pdf 文件。有什么解决办法吗?
  • 是的,我明白了:-)。谢谢@Rahul Patel
  • 你好 Hari,请使用以下代码在浏览器中查看文件。
【解决方案2】:

如果您不希望用户看到其他用户的文件,那么您永远不会期望来自客户端的用户的结果。

将数据存储在会话/数据库中,并在使用受限的情况下从中检索值。

【讨论】:

    【解决方案3】:

    真的有必要为文件名分配 id 吗?使用 id 作为隐藏字段仍然非常容易受到攻击。

    为什么不为每个用户生成一个具有唯一 ID 的文件名?如有必要,您可以再添加一个名为 uuid (char 36) 的数据库字段。你可以使用uniqid()functino。

    因此,每次,您可以将 uuid 存储在会话中并进行相应检查,而不是检查主键 id。

    【讨论】:

    • 所以,链接会像&lt;a href="uuid.pdf"&gt;view my file&lt;/a&gt; 对吗?然后用户可以再次输入任何随机 id 并有机会查看其他用户的文件。
    • 根据您的要求,用户可以只查看他们的文件吗?如果是这样,那么我们需要将 uuid 存储在数据库中,并用当前登录的用户检查这个 uuid。如果匹配,则您有权限。
    • 我应该在哪里检查请求的文件是否分配给当前登录的用户?我应该在那里创建一个新文件,从 URL 中提取 uuid,检查数据库,如果已分配,则允许他访问链接“uuid.pdf”?可以举个简单的例子吗?
    【解决方案4】:

    更好的解决方案是检查 isset $_SESSION['userId'] 并将其与 url 中的 id 进行比较

    <?php
        session_start();
        $link = $_SERVER['PHP_SELF'];
        $link_array = explode('/',$link);
        echo  $page = end($link_array);
        $id = explode('.',$page);
        $userid = $id[0];
        if(isset($_SESSION['userId']) && $userid== $_SESSION['userId']){        
            // display file
        }
        else{
            //not authorized 
        }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-23
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多