2016-08-20 3 views
1

ユーザが画像ファイルにアクセスするためにログインしているかどうか確認したいと思います。 画像は、このフォーム.htaccessとPHPで画像を保護する

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

私は.htaccessファイルでこれを試みただろう:私のprotect.phpファイル内

RewriteEngine On 
RewriteCond %{REQUEST_URI}\.jpg 
RewriteRule ^(.*)\.jpg$ /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") 
} 
?> 

私の質問:

  • filename.jpgをPHPファイルに渡すには、.htaccessファイルをどのようにしたらいいですか?
+1

ソリューションを含む質問を更新しないでください。 – MrTux

答えて

1

(あなたRewriteConditionは不要です)、次のようにPHPスクリプトにマッチしたファイル名を渡すためにあなたの.htaccess RewriteRuleを更新します。

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

次にあなたが$_SERVER['PATH_INFO']$_SERVER['PATH_TRANSLATED']を使用してパスの値にアクセスすることができます(そして、Apacheのこれについての詳細は、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

関連する問題