web-dev-qa-db-ja.com

特定のディレクトリの特定のファイルタイプへのアクセスを拒否する

一部のアプリケーションでは、ユーザーは自分のファイルをアップロードできます。これは非常に大きなファイルになる可能性があるため、独自のFTPクライアントを介してアップロードできます。

もちろん、私は彼らがサーバー上の他のすべてのファイルにアクセスできるいくつかのPHPファイルをアップロードすることを望みません。この動作を防止したい方法の1つは、特定のこれらのフォルダにあるファイルタイプ(php、rb、pyなど)。

フォルダー、ファイル、フォルダー内のファイルへのアクセスを拒否する方法を見つけましたが、フォルダー内のファイルの種類については何もしませんでした。

私が見つけたものを組み合わせてみました:

<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>

に変わる

<Files uploads/ "\.inc$">
Order allow,deny
Deny from all
</Files>

または別の方法

RewriteRule ^(\.php) - [F,L,NC] 

RewriteRule ^(uploads/\.php) - [F,L,NC]

しかし、どの構文を使用すればよいかわかりません。

したがって、たとえば、次のようにすることができます(基本的な例):

/index.php
/uploads/
  hack.php
  hack.rb
  hack.py
  pony.jpg

私はhack.php/rb/pyが利用できないようにしたいが、それ以外はすべて利用できるようにしたい。どの構文を使用する必要がありますか?

20
Dennis

FilesMatchディレクティブは、ファイル名に対してのみ機能します。パス部分は一切見ていません。

ルートの.htaccessファイルでディレクティブを指定してサブディレクトリを制御する場合は、 mod_rewrite を使用できます。

これを試して:

RewriteRule ^uploads/.*\.(php|rb|py)$ - [F,L,NC]

上記は、/ uploadsディレクトリまたはそのサブディレクトリにある.phpまたは.rbまたは.pyで終わるファイル名をブロックします。たとえば、以下をブロックします。

  • /uploads/something.php
  • /uploads/something/more.php

書き換えルールにはスラッシュがないことに注意してください。ディレクティブで使用する必要があるパスは、その配置場所によって異なります。上記のディレクティブをドキュメントルートの.htaccessファイルに配置すると、ドキュメントルートの直下にあるuploadsというディレクトリ内のファイルに対して機能します。

上記はあなたの質問に答えますが、ファイルをブロックしようとするよりも、特定のファイルのみを許可する方が安全です。多くの場合、サーバーは指定した拡張子以外の拡張子を持つファイルを実行します。

あなたはこのようなことをすることができます:

RewriteCond %{REQUEST_URI} ^/uploads [NC]
RewriteCond %{REQUEST_URI} !\.(jpe?g|png|gif)$ [NC]
RewriteRule .* - [F,L]

上記の場合、リクエストURIが/ uploadsで始まり、指定された拡張子のいずれかで終わっていない場合、それは禁止されます。拡張機能は、ニーズに合わせて変更できます。しかし、そのようにすれば、必要な拡張機能を許可することで、拡張機能のブロックに失敗したことに気付くのが遅すぎるのではなく、.

このルール(あなたの質問から)

RewriteRule ^(uploads/\.php) - [F,L,NC]

ブロックします

  • /uploads/.php
  • /uploads/.phpmore

ただし、ディレクトリ名とファイル拡張子の間には何も許可されません。

再ルールを使用する場合は、正規表現について詳しく知りたい場合があります。何かを調べる必要があるとき、私はしばしば www.regular-expressions.info を参照します。

18
toxalot

uploadディレクトリに.htaccessを置くことができます。ディレクティブは、このディレクトリとその下のディレクトリにのみ適用されます。詳細は ディレクティブの適用方法 を参照してください。

そのため、 FilesMatch を指定した.htaccessは、publicディレクトリにある場合、_*.inc_、_*.php_などに一致するファイルへのアクセスを制限できます。

_<FilesMatch "\.(?:inc|php|py|rb)$">
Order allow,deny
Deny from all
</FilesMatch>
_
22
Olaf Dietsche

次の最も簡単な1つのライナーソリューションを使用して、certenファイルタイプへのアクセスを拒否できます。

RedirectMatch 403 ^/folder/.+\.(png|gif|js)$

これは、クライアントが/ folder/file.extensionにアクセスしようとすると、403 Access forbiddenエラーを返します。

0
starkeen