24

一部のアプリケーションでは、ユーザーは自分のファイルをアップロードできます。これは非常に大きなファイルになる可能性があるため、独自の 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 を利用できないようにしたいが、それ以外はすべて利用できるようにしたい。どの構文を使用すればよいですか?

4

3 に答える 3

28

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]

ブロックします

  • /アップロード/.php
  • /uploads/.phpもっと見る

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

rewirte ルールを使用する場合は、regexp についてさらに学びたいと思うかもしれません。何か調べる必要があるときは、よくwww.regular-expressions.infoを参照します。

于 2013-12-10T08:04:32.957 に答える