odmów bezpośredniego dostępu do folderu i pliku przez htaccess

133

Oto scenariusz:

  • W index.phpfolderze głównym znajduje się plik
  • Niektóre pliki są objęte index.phpktóre znajdują się w includesfolderze.
  • Jeden inny plik ( submit.php) znajduje się w folderze głównym dla akcji przesyłania formularza.

Chcę ograniczyć bezpośredni dostęp użytkownika do plików w includesfolderze przez htaccess. także dla submit.php. Ale dołączanie będzie działać dla index.phppliku. Na przykład, jeśli użytkownik wpisze www.domain.com/includes/somepage.php, ograniczy to (może to być przekierowanie do strony błędu).

Imrul.H
źródło

Odpowiedzi:

266

Po prostu przeniósłbym includesfolder z katalogu głównego, ale jeśli chcesz zablokować bezpośredni dostęp do całego includesfolderu, możesz umieścić .htaccessw tym folderze plik, który zawiera tylko:

deny from all

W ten sposób nie możesz otworzyć żadnego pliku z tego folderu, ale możesz bez problemu umieścić je w php.

jeroen
źródło
7
Czy inny plik będzie mógł wysłać żądanie Ajax do pliku znajdującego się w tym folderze?
Chaitanya Chandurkar
16
@ChaitanyaChandurkar Nie, żądanie AJAX jest normalnym żądaniem http, więc zostanie odrzucone.
jeroen
Sr b / c I nowe programowanie internetowe. Jak mogę dodać wyjątek dla dostępu do mojego pliku index.php?
PhatHV
Użyłem odmowy od wszystkich i ograniczyłem każdy adres URL ... nie pokazując nawet strony logowania .. :(
Aamir
@Aamir To prawda, żaden adres URL w tym folderze nie będzie dostępny, ale można je bez problemu umieścić w innych plikach.
jeroen
56

To jest mod_rewriterozwiązanie oparte na czystej bazie:

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

To pokaże zakazanego błędem użycie jeśli URI zawiera albo /includes/albo/submit.php

anubhava
źródło
3
Dobra robota, adresowanie przesłanego pliku
CTS_AE,
29

Można użyć dyrektywy Files i zabronić dostępu do wszystkich plików, a następnie użyć jej ponownie, aby ustawić pliki, które są dostępne:

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

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>
luke1985
źródło
6
Nie jestem pewien co do tego, który opublikował pytanie, czy jego problem został rozwiązany, czy nie, ale to jest piękno WIĘCEJ, że wielokrotna odpowiedź może pomóc wielu członkom. Ta ostatnia odpowiedź rozwiązała mój problem. Chcę, aby strony otrzymywały plik css, ale nie mają dostępu do czcionek ttf lub otf, i bum! zdecydowany.
Moxet Khan
po tym nie mogę uzyskać dostępu do plików w podfolderach
Gintare Statkute
14

1 rozwiązanie oparte na liner mod_alias:

RedirectMatch 403 ^/folder/file.php$

Spowoduje to wyświetlenie niedozwolonego błędu dla /folder/file.php

Amit Verma
źródło
1
+1 - To jest naprawdę bardzo dobre, ponieważ nikt nie może nawet zobaczyć, które pliki istnieją, jeśli zastosujesz 404 do całego folderu, używając wyrażenia regularnego ^folder.
bytecode77
9

Jeśli dobrze rozumiem, chcesz po prostu odmówić dostępu do folderu include?

.Htaccess z dyrektywą „DENY FROM ALL” umieszczoną w folderze include mógłby załatwić sprawę.

mainegreen
źródło
8

Twoje Q składa się z dwóch części, zarówno rozwiązania jeroen, jak i anubhava działają w części I - odmowa dostępu / dołączenia. anubhava działa również w części II. Wolę to drugie, ponieważ i DOCROOT/.htaccesstak używam a to trzyma całą taką kontrolę w jednym pliku.

Jednak to, o czym chciałem dyskutować, to koncepcja „odmowy dostępu submit.php”. Jeśli nie chcesz używać, submit.phpto po co w ogóle mieć go w DOCROOT? Podejrzewam, że odpowiedzią tutaj jest to, że używasz go jako celu działania w niektórych formach i chcesz, aby był uruchamiany tylko wtedy, gdy formularz jest przesyłany, a nie bezpośrednio, np. Ze spambota.

Jeśli to prawda, nie możesz użyć części II anubhawy, ponieważ spowoduje to niepowodzenie twojej formy. Możesz tutaj (i) .htaccesssprawdzić, czy stroną odsyłającą jest Twoja własna strona indeksu:

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

I (ii) w swoim generatorze formularzy index.php w PHP zawiera kilka ukrytych pól dla znacznika czasu i walidacji. Walidacją może być, powiedzmy, pierwsze 10 znaków MD5 znacznika czasu i jakiś wewnętrzny sekret. Przetwarzając przesłaną wiadomość, możesz następnie (i) sprawdzić, czy znacznik czasu i walidacja są zgodne, oraz (ii) znacznik czasu znajduje się w, powiedzmy, 15 minutach od aktualnego czasu.

Możesz w ten sposób zapobiec spamowaniu, ponieważ jedynym praktycznym sposobem, w jaki spamer mógłby uzyskać poprawną parę znacznika czasu / walidacji, byłaby analiza formularza, ale ta zdrapka miałaby tylko 15 minut życia.

TerryE
źródło
6

W zależności od możliwych innych opcji ustawionych na wyższym poziomie, może być konieczne umieszczenie w pliku .htaccess w katalogu include:

Satisfy all
Order deny,allow
Deny from all

Wpadłem na to, gdy w wyższym katalogu zdefiniowano podstawowe uwierzytelnianie, w tym wiersz:

Satisfy any

To uniemożliwiało zastosowanie mojej odmowy od wszystkich, ponieważ użytkownicy byli uwierzytelnieni.

Keith
źródło
1

Możesz dodać poniższe polecenie do .htaccesspliku

Deny from all
ErrorDocument 403 "nothing is here"

W przypadku nieautoryzowanego dostępu wyświetli komunikat „nic tu nie ma”.

Jeśli chcesz przekierować kod błędu do określonej strony, możesz zdefiniować polecenie w następujący sposób:

ErrorDocument 404 "/errors/404.html"

Przekieruje do /errors/404.htmli pokaże ekran nie znaleziono niestandardowej strony.

user1324491
źródło