Problemy wynikające z używania pliku .htaccess

Spis treści

Na stronie Apache jest kawałek ciekawego artykułu na temat zagrożeń jakie niesie ze sobą stosowanie pliku .htaccess w katalogach stron trzymanych na serwerze wwww. Oczywiście, w pewnych sytuacjach, takich jak np. hostingi, nie będziemy mieć innego wyboru jak zdać się na ten plik ale jeśli mamy bezpośredni dostęp do konfiguracji Apache, możemy przenieść wszystkie te wpisy z pliku .htaccess i poprawić tym bezpieczeństwo witryny jak i po części wydajność samego serwera www.

Zagrożenia wynikające z posiadania pliku .htaccess

Jeśli pozwalamy zwykłym użytkownikom na zmiany konfiguracji serwera, a to właśnie ma na celu plik .htaccess , to będą oni w stanie wprowadzać zmiany, nad którymi nie będziemy mieli żadnej kontroli jako administrator serwera www. Dlatego też jeśli zdecydowaliśmy się na nadanie użytkownikom uprawnień dotyczących zmiany konfiguracji, to przynajmniej zastosujmy pewne restrykcje wynikające z dyrektywy AllowOverride, bo nie zawsze w każdym przypadku musimy stosować All .

Poza tym, jakby nie patrzeć, dostęp do pliku .htaccess powinien być bardzo restrykcyjny, bo mogą znajdować się tam wrażliwe dane, a poza tym, figuruje on bezpośrednio w katalogu strony hostowanej publicznie, przez co można uzyskać do niego dostęp i np. w wyniku błędnych uprawnień, zmienić go. Dlatego też bezpieczne prawa do tego pliku powinny zostać ustawione jedynie na odczyt i to w taki sposób by tylko Apache mógł go czytać. Można również się pokusić o dopisanie poniższej zwrotki do konfiguracji wirtualnych hostów w Apache:

<files "^\.ht">
    Order allow,deny
    Deny from all
</files>

Choć standardowo powinna być ona już wpisana w głównym pliku konfiguracyjnym, bo dzięki takiemu rozwiązaniu, próba odczytu pliku .htaccess (w sumie jakiegokolwiek pliki, którego nazwa zaczyna się od .ht ) poprzez wywołanie jego adresu, np. w przeglądarce, nie będzie możliwa.

Wydajność serwera www płynąca z braku pliku .htaccess

Jeśli chodzi o wydajność, to serwer Apache będzie szukał pliku .htaccess w każdym możliwym folderze, a jeśli tych jest dużo, to niemal pewne jest, że wydajność na tym ucierpi. Poza tym, ten plik jest wczytywany przy każdym zapytaniu, czyli przy odwiedzaniu kolejnych linków w naszej witrynie, a to dodatkowe obciążenie. No i oczywiście, jeśli mamy szereg folderów, w których ten plik występuje, to serwer musi przeanalizować wszystkie pliki .htaccess kolejno w nadrzędnych katalogach, by zaaplikować wszystkie reguły.

Tak więc jeśli mamy przykładową strukturę folderów /www/htdocs/example , to żądanie o plik .htaccess zostanie wysłane 4 razy:

/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess

Przenoszenie zawartości pliku .htaccess

Dlatego też jeśli zależy nam na wydajności serwera oraz jego bezpieczeństwie i mamy przy tym dostęp do konfiguracji swojego wirtualnego hosta, to przydałoby się przenieść całą zawartość pliku .htaccess właśnie w to miejsce. Przykładowo, jeśli mamy blog WordPressa i stosujemy w nim permalinki , to będziemy potrzebować poniższego kodu, by te linki zaczęły działać:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
<IfModule>

By przenieść ten kod, kopiujemy go "tak jak jest" i umieszczamy wewnątrz dyrektywy <Directory> w pliku /etc/apache2/apache2.conf . Można również bezpośrednio w plikach wirtualnych hostów (katalog /etc/apache/sites-available/), z tym, że jeśli nasz serwer ma zaimplementowaną obsługę SSL, to musimy ten powyższy blok wpisać dwa razy.

Reasumując, konfiguracja permalinków w powyższym przykładzie powinna wyglądać mniej więcej tak:

<Directory /apache/morfitronix>

    Options FollowSymLinks
    AllowOverride None
    Require all granted

# Wordpress permalinks
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
        RewriteRule ^index\.php$ - [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]
    </IfModule>

</Directory>

I w ten sposób, nie będziemy już musieli się martwić o treść pliku .htaccess, bo nie będzie miała ona już dla nas żadnego znaczenia. Mało tego, serwer www nie będzie nawet brał pod uwagę tego pliku, oczywiście w przypadku gdyby został przez kogoś utworzony.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.