簡體   English   中英

允許訪問PHP中的特定文件

[英]Allow access to particular file in PHP

在我的項目中,用戶將上傳pdf文件。 該文件將存儲在名為'uploads'的目錄中,名稱$_SESSION['userId'].".pdf" 現在,用戶可以使用'myweb.com/uploads/id.pdf'訪問該文件。 但是,當用戶在瀏覽器的網址欄中更改id值時,他便可以訪問其他用戶的文件。 為了防止這種情況,我想用一個鏈接將表單的隱藏類型$_SESSION['userId']到下一頁。 在下一頁中,將使用發布的ID重定向到文件。 這個主意好嗎? 還是有更好的解決方案?

在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." );
?>

如果您不希望用戶看到其他用戶的文件,那么您永遠不會期望用戶從客戶端獲得結果。

在使用受限的情況下,將數據存儲在會話/數據庫中,並從中檢索值。

確實需要為文件名分配ID嗎? 使用id作為隱藏字段仍然非常容易受到攻擊。

為什么不為每個用戶生成具有唯一ID的文件名? 如有必要,您可以再添加一個名為uuid(字符36)的數據庫字段。 您可以使用uniqid()函數。

因此,每次,您都可以將uuid存儲在會話中並進行相應的檢查,而不是使用主鍵ID進行檢查。

更好的解決方案是檢查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 
    }
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM