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


134

ここにシナリオがあります:

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

includeshtaccessによるフォルダー内のファイルへの直接ユーザーアクセスを制限したい。またsubmit.php。ただし、includeはindex.phpファイルに対して機能します。同様に、ユーザーがと入力すると、www.domain.com/includes/somepage.php制限されます(エラーページにリダイレクトされる場合があります)。

回答:


266

includesフォルダーをweb-rootの外に移動するだけですが、フォルダー全体への直接アクセスをブロックしたい場合はincludes、次のもの.htaccessだけを含むファイルをそのフォルダーに置くことができます。

deny from all

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


7
他のファイルは、そのフォルダーにあるファイルに対してajaxリクエストを行うことができますか?
Chaitanya Chandurkar 2013

16
@ChaitanyaChandurkarいいえ、ajaxリクエストは通常​​のhttpリクエストなので拒否されます。
jeroen 2013

Sr b / c私は新しいウェブプログラミングです。ファイルindex.phpにアクセスするための例外を追加するにはどうすればよいですか?
PhatHV 2015

私はすべてからの拒否を使用し、すべてのURLを制限しました。ログインページも表示されません。:(
Aamir

@Aamir正解です。そのフォルダのURLにはアクセスできませんが、他のファイルに問題なく含めることができます。
jeroen

56

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

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

これは、URIに/includes/またはのいずれかが含まれている場合に使用する禁止エラーを示します/submit.php


3
送信ファイルの
処理に成功

29

Filesディレクティブを使用してすべてのファイルへのアクセスを禁止し、それを再び使用してアクセス可能なファイルを設定することが可能です。

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

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

7
質問を投稿した人が問題が解決したかどうかはわかりませんが、複数回答が多くのメンバーを助けることができるSOの美しさです。この最後の回答で私の問題は解決しました。サイトがcssファイルを取得できるようにしたいが、ttfまたはotfフォントにアクセスできないようにしたいと思います。解決しました。
Moxet Khan 2016

この後、私はサブフォルダ内のファイルにアクセスするのが
苦手です

14

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

RedirectMatch 403 ^/folder/file.php$

/folder/file.phpの禁止エラーが表示されます


1
+1-これは実際には非常に優れています。正規表現を使用して404をフォルダ全体に適用すると、どのファイルが存在するかさえ誰にもわからないため^folderです。
bytecode77

9

私が正しく理解している場合、includesフォルダーへのアクセスを拒否したいだけですか?

インクルードフォルダーに配置された 'DENY FROM ALL'ディレクティブを含む.htaccessがうまく機能します。


8

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分だけです。


6

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

Satisfy all
Order deny,allow
Deny from all

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

Satisfy any

これは、ユーザーが認証されているため、すべての拒否が有効になるのを妨げていました。


1

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

Deny from all
ErrorDocument 403 "nothing is here"

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

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

ErrorDocument 404 "/errors/404.html"

にリダイレクトされ、/errors/404.htmlカスタムページが見つかりません画面が表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.