2016-08-20 101 views
1

我想檢查用戶是否登錄訪問圖像文件。 圖片會有這種形式通過.htaccess和PHP保護圖像

https://domain.com/folders/imagename.jpg 

我在.htaccess試過這樣:

RewriteEngine On 
RewriteCond %{REQUEST_URI}\.jpg 
RewriteRule ^(.*)\.jpg$ /protect.php 

這在我protect.php文件

<?php 
if(rcp_is_active()){ 
    header('Content-Type: image/jpg'); 
    readfile($imageurl); 
} 
else{ 
    readfile("https://placeholdit.imgix.net/~text?txtsize=38&txt=Forbidden&w=400&h=400") 
} 
?> 

我的問題:

  • 我應該如何完成我的.htaccess文件以將filename.jpg傳遞給php文件?
+1

您不應該更新問題以包含解決方案。 – MrTux

回答

1

更新你的.htaccess RewriteRule的匹配文件名傳遞給PHP腳本如下(您RewriteCondition是多餘的):

RewriteEngine On 
RewriteRule ^((.*)\.jpg)$ /protect.php/$1 

然後你可以使用$_SERVER['PATH_INFO']$_SERVER['PATH_TRANSLATED']訪問通行證值(當時阿帕奇嘗試根據文檔根目錄將其映射到實際路徑,有關詳細信息,請參見mod_cgiRFC 3875)。需要在Apache httpd中啓用AcceptPathInfo(默認)。

,或者使用

RewriteRule ^((.*)\.jpg)$ /protect.php?filename=$1 

並使用$_GET['filename']。特別是在這裏,要小心目錄遍歷攻擊(例如,有人使用/protect.php?filename=../../someother-file.jpg)。我通常應用realpath來規範化路徑並檢查它是否從包含文件或文檔根目錄的文件夾($_SERVER['DOCUMENT_ROOT'])開始。

在這兩種情況下,請確保您只提供允許的文件(例如,如果攻擊者使用/protect.php/protect.php會發生什麼情況)。這可能會泄露敏感數據。

PS:也許你還想讓響應不可緩存或提供Content-Length。

PSS:即使對於禁止的情況,您還需要提供適當的Content-Type - 或使用重定向(header('Status: 302');header("Location: https://placeholdit.imgix.net/~text?txtsize=38&txt=Forbidden&w=400&h=400");),以便您不需要一次又一次重新請求該圖像。

+0

看起來不錯,但我得到奇怪的字符 –

+0

當我直接訪問文件ex:url/filename.jpg –

+0

我不明白你的意思是奇怪的字符。 – MrTux