Verweigern Sie den direkten Zugriff auf einen Ordner und eine Datei durch htaccess

133

Hier ist das Szenario:

  • index.phpIm Stammordner befindet sich eine Datei
  • Es sind einige Dateien enthalten, index.phpdie sich im includesOrdner befinden.
  • 1 andere Datei ( submit.php) befindet sich im Stammordner für die Formularübermittlungsaktion.

Ich möchte den direkten Benutzerzugriff auf die Dateien im includesOrdner durch htaccess einschränken. auch für submit.php. Include funktioniert jedoch für index.phpDateien. Wenn Benutzer eingeben www.domain.com/includes/somepage.php, wird dies eingeschränkt (möglicherweise wird auf eine Fehlerseite umgeleitet).

Imrul.H
quelle

Antworten:

266

Ich würde den includesOrdner nur aus dem Webstamm verschieben, aber wenn Sie den direkten Zugriff auf den gesamten includesOrdner blockieren möchten , können Sie eine .htaccessDatei in diesen Ordner legen , die nur Folgendes enthält:

deny from all

Auf diese Weise können Sie keine Datei aus diesem Ordner öffnen, aber Sie können sie ohne Probleme in PHP aufnehmen.

Jeroen
quelle
7
Kann eine andere Datei eine Ajax-Anfrage an die in diesem Ordner vorhandene Datei stellen?
Chaitanya Chandurkar
16
@ChaitanyaChandurkar Nein, eine Ajax-Anfrage ist eine normale http-Anfrage, die abgelehnt wird.
Jeroen
Sr b / c ich neue Webprogrammierung. Wie kann ich eine Ausnahme für den Zugriff auf meine Datei index.php hinzufügen?
PhatHV
Ich habe von allen abgelehnt und es hat jede URL eingeschränkt. Es wird nicht einmal die Anmeldeseite angezeigt. :(
Aamir
@Aamir Das ist richtig, auf keine URL in diesem Ordner kann zugegriffen werden, aber Sie können sie problemlos in andere Dateien aufnehmen.
Jeroen
56

Dies ist eine reine mod_rewriteLösung:

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

Dies zeigt einen verbotenen Fehler an, wenn der URI entweder /includes/oder enthält/submit.php

Anubhava
quelle
3
Gute Arbeit beim Adressieren der
Submit-
29

Es ist möglich, eine Datei-Direktive zu verwenden und den Zugriff auf alle Dateien zu verbieten. Verwenden Sie sie dann erneut, um die Dateien festzulegen, auf die zugegriffen werden kann:

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

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>
luke1985
quelle
6
Ich bin mir nicht sicher, wer die Frage gestellt hat, ob sein Problem gelöst ist oder nicht, aber das ist das Schöne an SO, dass Mehrfachantworten vielen Mitgliedern helfen können. Diese letzte Antwort hat mein Problem gelöst. Ich möchte, dass Websites CSS-Dateien erhalten, aber keinen Zugriff auf ttf- oder otf-Schriftarten haben, und boom! aufgelöst.
Moxet Khan
Danach kann
14

1 Liner mod_alias-basierte Lösung:

RedirectMatch 403 ^/folder/file.php$

Dies zeigt einen verbotenen Fehler für /folder/file.php an

Amit Verma
quelle
1
+1 - Das ist eigentlich sehr gut, weil niemand sehen kann, welche Dateien existieren, wenn Sie 404 mit Regex auf einen ganzen Ordner anwenden ^folder.
Bytecode77
9

Wenn ich das richtig verstehe, möchten Sie nur den Zugriff auf den Includes-Ordner verweigern?

Ein .htaccess mit einer Direktive 'DENY FROM ALL' im Includes-Ordner würde den Trick machen.

mainegreen
quelle
8

Ihr Q besteht aus zwei Teilen: Die Lösungen von Jeroen und Anubhava funktionieren für Teil I - Verweigern des Zugriffs auf / Includes. Anubhava funktioniert auch für Teil II. Ich bevorzuge letzteres, weil ich DOCROOT/.htaccesssowieso ein benutze und dies alle diese Kontrolle in einer Datei behält.

Was ich jedoch nicht diskutieren wollte, ist das Konzept "Zugang verweigern submit.php". Wenn Sie nicht verwenden möchtensubmit.php warum haben Sie es dann überhaupt in DOCROOT? Ich vermute, dass die Antwort hier lautet, dass Sie es in einigen Formularen als Aktionsziel verwenden und möchten, dass es nur ausgelöst wird, wenn das Formular gesendet wird und nicht direkt, z. B. von einem Spambot.

Wenn dies zutrifft, können Sie Anubhavas Teil II nicht verwenden, da dies dazu führt, dass Ihr Formular fehlschlägt. Was Sie hier tun können, ist (i) mit der .htaccessÜberprüfung, um sicherzustellen, dass der Referrer Ihre eigene Indexseite war:

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

Und (ii) in Ihrem PHP index.php Formulargenerator einige versteckte Felder für einen Zeitstempel und eine Validierung enthalten. Die Validierung könnte beispielsweise die ersten 10 Zeichen eines MD5 des Zeitstempels und ein internes Geheimnis sein. Bei der Verarbeitung der Übermittlung können Sie dann (i) überprüfen, ob der Zeitstempel und die Validierung übereinstimmen, und (ii) der Zeitstempel liegt beispielsweise innerhalb von 15 Minuten nach der aktuellen Zeit.

Auf diese Weise können Sie Spam verhindern, da der einzige praktische Weg, auf dem ein Spammer ein gültiges Zeitstempel / Validierungspaar erhalten kann, darin besteht, ein Formular zu analysieren. Dieser Scrape hat jedoch nur eine Lebensdauer von 15 Minuten.

TerryE
quelle
6

Abhängig von möglichen anderen Optionen, die auf einer höheren Ebene festgelegt wurden, müssen Sie möglicherweise Folgendes in Ihre .htaccess-Datei in Ihrem Includes-Verzeichnis einfügen:

Satisfy all
Order deny,allow
Deny from all

Ich bin darauf gestoßen, als das obere Verzeichnis die Basisauthentifizierung einschließlich der Zeile definiert hat:

Satisfy any

Dies verhinderte, dass meine Ablehnung wirksam wurde, da die Benutzer authentifiziert wurden.

Keith
quelle
1

Sie können der .htaccessDatei den folgenden Befehl hinzufügen

Deny from all
ErrorDocument 403 "nothing is here"

Im Falle eines nicht autorisierten Zugriffs wird die Meldung "Nichts ist hier" angezeigt.

Wenn Sie durch einen Fehlercode auf eine bestimmte Seite umleiten möchten, können Sie einen Befehl wie folgt definieren:

ErrorDocument 404 "/errors/404.html"

Es wird zum /errors/404.htmlBildschirm weitergeleitet und die benutzerdefinierte Seite wird nicht gefunden angezeigt.

user1324491
quelle