web-dev-qa-db-ja.com

htaccessによるフォルダとファイルへの直接アクセスを拒否する

これがシナリオです。

  • ルートフォルダにindex.phpファイルがあります
  • いくつかのファイルはincludesフォルダーにあるindex.phpに含まれています。
  • 他の1ファイル(submit.php)がフォーム送信アクションのルートフォルダにあります。

Htaccessでincludesフォルダー内のファイルへの直接ユーザーアクセスを制限したいです。 submit.phpの場合も同様です。しかし、includeはindex.phpファイルに対して機能します。同様に、ユーザーがwww.domain.com/includes/somepage.phpをタイプした場合、それを制限します(エラーページにリダイレクトされるかもしれません)。

125
Imrul.H

includesフォルダをweb-rootの外に移動するだけですが、includesフォルダ全体への直接アクセスをブロックしたい場合は、そのフォルダに.htaccessファイルを追加します。

deny from all

この方法ではそのフォルダからファイルを開くことはできませんが、問題なくphpに含めることができます。

257
jeroen

これは純粋なmod_rewriteベースのソリューションです。

RewriteRule ^(includes/|submit\.php) - [F,L,NC]

URIが/includes/または/submit.phpのいずれかを含む場合、これは使用することを禁じられたエラーを示すでしょう

51
anubhava

Filesディレクティブを使用してすべてのファイルへのアクセスを許可しないでアクセス可能なファイルを設定することが可能です。

<Files ~ "^.*">
  Deny from all
</Files>

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>
19
spectre

1ライナーmod_aliasベースのソリューション:

RedirectMatch 403 ^/folder/file.php$

これは/folder/file.phpの禁止エラーを表示します

13
starkeen

私が正しく理解しているなら、あなたは単にincludesフォルダへのアクセスを拒否したいですか?

Includesフォルダに置かれた 'DENY FROM ALL'ディレクティブを持つ.htaccessがうまくいくでしょう。

9
mainegreen

あなたのQは2つの部分に分かれています、jeroenとanubhavaの両方の解決策はパートIのために働きます - /includesへのアクセスを拒否します。 anubhavaもパートIIのために働きます。私はとにかくDOCROOT/.htaccessを使用していて、そのような制御をすべて1つのファイルに保存しているので、私は後者を好みます。

しかし私が議論したかったのは「submit.phpへのアクセスを拒否する」という概念です。もしあなたがsubmit.phpを使いたくないのなら、どうしてそれをDOCROOTに入れないのでしょうか。ここでの答えは、あなたがいくつかのフォームでアクションターゲットとしてそれを使用していて、フォームが直接送信されるのではなくフォームが送信されたときにのみ起動されることを望んでいることです。スパムロボットから。

もしこれが本当なら、あなたのフォームが失敗する原因となるのであなたはanubhavaのパートIIを使うことはできません。ここでできることは、(i)参照元が自分のインデックスページであることを確認するための.htaccessチェックです。

RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
RewriteRule ^submit\.php$    -                                   [F]

そして(ii)あなたのPHP index.phpフォームジェネレータの中にはタイムスタンプと検証のための隠しフィールドが含まれています。検証は、たとえば、タイムスタンプのMD5の最初の10文字と内部の秘密などです。送信の処理時に、(i)タイムスタンプと検証が一致していることを検証し、(ii)タイムスタンプが現在時刻から15分以内であることを確認できます。

これにより、スパマーが有効なタイムスタンプと検証のペアを取得できる唯一の実用的な方法は、フォームを解析することですが、このスクレープは15分の寿命しかありません。

8
TerryE

より高いレベルで設定されている他の可能なオプションによっては、includesディレクトリの.htaccessファイルに以下を入れる必要があるかもしれません。

Satisfy all
Order deny,allow
Deny from all

上のディレクトリが次の行を含む基本認証を定義したとき、私はこれに遭遇しました:

Satisfy any

これは、ユーザーが認証されたために、私の拒否をすべての人に反映させることを妨げていました。

6
Keith

.htaccessファイルに以下のコマンドを追加することができます。

Deny from all
ErrorDocument 403 "nothing is here"

不正アクセスの場合は、「ここには何もありません」というメッセージが表示されます。

エラーコードによって特定のページにリダイレクトしたい場合は、次のようにコマンドを定義できます。

ErrorDocument 404 "/errors/404.html"

これは/errors/404.htmlにリダイレクトし、カスタムページが見つからないという画面を表示します。

0
user1324491