[英]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.