Przejdź do treści
WWW i WordPress

Jak zabezpieczyć stronę www hasłem: .htaccess, nginx, WordPress i panel hostingu

Jak zabezpieczyć stronę www hasłem? Instrukcje dla .htaccess i .htpasswd, nginx, WordPressa (wpis, cała strona) i panelu hostingu oraz błędy, których unikać.

CZCzarek ZawolskiAktualizacja: 7 min czytania
Okno logowania z prośbą o hasło przed wejściem na stronę internetową

W skrócie

  • Najpewniejszy sposób to ochrona po stronie serwera: Basic Auth w Apache (.htaccess + .htpasswd) lub nginx (auth_basic). Hasło jest sprawdzane, zanim serwer wyśle jakąkolwiek treść.
  • Na hostingu współdzielonym zwykle wystarczy opcja „Ochrona katalogów hasłem” w panelu (cPanel, DirectAdmin) — panel sam utworzy pliki.
  • W WordPressie pojedynczy wpis lub stronę zabezpieczysz wbudowaną opcją ochrony hasłem, a całą witrynę wtyczką, np. Password Protected.
  • Ochrona hasłem ma sens tylko przez HTTPS — w Basic Auth login i hasło są przesyłane w każdym żądaniu, jedynie zakodowane w Base64.
  • Nie używaj „haseł” w JavaScripcie: kod i hasło widać w źródle strony, więc taka ochrona jest pozorna.
Spis treści

Stronę www najlepiej zabezpieczyć hasłem po stronie serwera: w Apache za pomocą plików .htaccess i .htpasswd, w nginx dyrektywą auth_basic, a na hostingu współdzielonym — opcją ochrony katalogu hasłem w panelu administracyjnym. Jeśli strona działa na WordPressie, pojedynczy wpis zabezpieczysz wbudowaną funkcją edytora, a całą witrynę — wtyczką.

Wybór metody zależy od tego, co chcesz chronić: całą stronę w budowie, panel administracyjny, katalog z plikami dla klienta czy jeden artykuł. Poniżej znajdziesz instrukcje dla każdego przypadku i listę błędów, które sprawiają, że „zabezpieczenie” niczego nie zabezpiecza.

Którą metodę wybrać

SytuacjaNajlepsza metodaPoziom ochrony
Strona w budowie, wersja testowa (staging)Basic Auth w Apache/nginx lub w panelu hostinguwysoki — nic nie wycieka przed podaniem hasła
Katalog z plikami dla klientaBasic Auth na katalogwysoki
Pojedynczy wpis lub strona w WordPressiewbudowana ochrona hasłemśredni — chroni treść, ale nie pliki z Mediów
Cała witryna WordPress dla wąskiego gronawtyczka (np. Password Protected) lub Basic Authśredni–wysoki
Dostęp dla zespołu z kontrolą, kto wchodziCloudflare Access lub logowanie użytkownikówwysoki, z imiennymi kontami

Sposób 1: .htaccess i .htpasswd na serwerze Apache

To klasyczna metoda uwierzytelniania HTTP Basic. Przeglądarka wyświetla okno z loginem i hasłem, a serwer nie wyśle żadnej treści, dopóki dane nie będą poprawne. Działa na Apache i LiteSpeed (który odczytuje pliki .htaccess).

Krok 1: utwórz plik .htpasswd

Plik zawiera login i skrót hasła (nie samo hasło). Jeśli masz dostęp do terminala, użyj narzędzia htpasswd z pakietu apache2-utils (Debian/Ubuntu) lub httpd-tools (RHEL, Rocky, Alma):

# -c tworzy nowy plik, -B wymusza algorytm bcrypt
htpasswd -c -B /home/uzytkownik/.htpasswd jan

# kolejny użytkownik — już bez -c, bo nadpisałbyś plik
htpasswd -B /home/uzytkownik/.htpasswd anna

Plik wygląda tak (to skrót bcrypt, a nie hasło):

jan:$2y$05$...

Bez dostępu do terminala możesz wygenerować wpis lokalnie (np. htpasswd jest dostępny w pakietach z Apache dla Windows) albo skorzystać z opcji panelu hostingu opisanej niżej. Unikaj wpisywania prawdziwych haseł w przypadkowe generatory online.

Krok 2: dodaj reguły do .htaccess

W katalogu, który chcesz chronić (np. public_html dla całej strony), utwórz lub edytuj plik .htaccess:

AuthType Basic
AuthName "Strona w przygotowaniu"
AuthUserFile /home/uzytkownik/.htpasswd
Require valid-user

AuthUserFile wymaga pełnej, bezwzględnej ścieżki. Jeśli nie wiesz, jaka jest na Twoim hostingu, utwórz tymczasowo plik sciezka.php z zawartością <?php echo __DIR__; i otwórz go w przeglądarce — potem go usuń.

Uwaga: Trzymaj .htpasswd poza katalogiem publicznym (np. piętro wyżej niż public_html). Apache domyślnie blokuje pobieranie plików zaczynających się od .ht, ale nie każda konfiguracja serwera to gwarantuje.

Wyjątki: dostęp bez hasła z Twojego adresu IP

W Apache 2.4 możesz wpuścić wybrane adresy bez hasła, a resztę poprosić o logowanie:

AuthType Basic
AuthName "Strona w przygotowaniu"
AuthUserFile /home/uzytkownik/.htpasswd

<RequireAny>
    Require ip 203.0.113.25
    Require valid-user
</RequireAny>

Aby chronić tylko jeden plik, otocz reguły blokiem <Files "raport.pdf"> … </Files>. Jeżeli po zmianach widzisz błąd 500, serwer najpewniej nie pozwala na dyrektywy uwierzytelniania w .htaccess (brak AllowOverride AuthConfig) albo ścieżka do pliku jest błędna. Gdy zamiast okna logowania pojawia się 403, sprawdź poradnik o błędzie 403 Forbidden.

Sposób 2: auth_basic w nginx

Nginx nie obsługuje plików .htaccess, więc konfigurację dodajesz w pliku witryny, np. /etc/nginx/sites-available/example.conf:

server {
    server_name staging.example.com;

    location / {
        auth_basic           "Strona w przygotowaniu";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

Plik z hasłami utworzysz tym samym narzędziem htpasswd (bez -B użyje formatu APR1-MD5, który nginx obsługuje zawsze). Potem sprawdź konfigurację i przeładuj serwer:

sudo htpasswd -c /etc/nginx/.htpasswd jan
sudo nginx -t && sudo systemctl reload nginx

Wyjątek dla adresu IP zrobisz dyrektywą satisfy any; razem z allow 203.0.113.25; i deny all; w tym samym bloku location.

Sposób 3: ochrona katalogu w panelu hostingu

Na hostingu współdzielonym nie musisz niczego pisać ręcznie. Panele mają gotowe kreatory:

  • cPanel: sekcja Pliki → Directory Privacy (w polskiej wersji „Prywatność katalogu”) → wybierz katalog → zaznacz ochronę hasłem → dodaj użytkownika.
  • DirectAdmin: Advanced Features → Password Protected Directories → wybierz katalog → ustaw login i hasło.
  • Polskie panele autorskie hostingodawców zwykle mają podobną opcję w ustawieniach strony lub serwera WWW, często pod nazwą „Ochrona katalogów hasłem”.

Panel tworzy pliki .htaccess i .htpasswd w bezpiecznym miejscu, więc to najprostsza i najmniej podatna na pomyłki metoda.

Sposób 4: hasło na wpis, stronę lub całą witrynę WordPress

Pojedynczy wpis lub strona

WordPress ma wbudowaną ochronę hasłem. W edytorze blokowym otwórz panel ustawień wpisu po prawej stronie, kliknij pole Status (w starszych wersjach Widoczność) i wybierz ochronę hasłem — w zależności od wersji to opcja „Chronione hasłem” albo pole „Hasło”. Wpisz hasło i zaktualizuj wpis.

Co warto wiedzieć:

  • Odwiedzający zobaczy formularz zamiast treści; po podaniu hasła WordPress zapisze ciasteczko i przez kilka dni nie poprosi o nie ponownie.
  • Każdy wpis ma jedno wspólne hasło dla wszystkich — nie da się sprawdzić, kto wszedł.
  • Pliki z biblioteki mediów (obrazki, PDF-y) nadal są dostępne pod bezpośrednim adresem.
  • Tytuł wpisu pozostaje widoczny na listach wpisów, z przedrostkiem „Zabezpieczone hasłem”.

Cała witryna

Do zablokowania całej strony WordPress (np. przed premierą) użyj wtyczki. Popularna jest Password Protected — po aktywacji w Ustawienia → Password Protected włączasz ochronę, ustawiasz hasło i decydujesz, czy administratorzy i zalogowani użytkownicy mają wchodzić bez hasła. Wtyczka pozwala też dopuścić wybrane adresy IP i zapamiętać logowanie na określony czas.

Wtyczka chroni strony generowane przez WordPressa, ale nie pliki statyczne w katalogu wp-content/uploads. Jeśli te pliki są poufne, dodaj Basic Auth na serwerze.

Dodatkowe hasło na panel administracyjny

Basic Auth możesz postawić także przed wp-login.php, co odcina boty zgadujące hasła. Nie blokuj jednak całego katalogu wp-admin bez wyjątku dla admin-ajax.php, bo przestaną działać funkcje strony korzystające z AJAX-a. Więcej o sensownych i pozornych sposobach ukrywania panelu przeczytasz w tekście o Hide WP Admin.

Sposób 5: Cloudflare Access i podobne usługi

Jeśli strona działa za Cloudflare, możesz postawić przed nią bramkę logowania bez zmian na serwerze: w panelu Zero Trust → Access → Applications dodajesz aplikację typu self-hosted, wskazujesz domenę lub ścieżkę i tworzysz politykę, np. „wpuść adresy e-mail z listy”. Użytkownik dostaje jednorazowy kod na e-mail albo loguje się kontem Google lub Microsoft. Zaletą jest to, że każdy ma imienny dostęp, a Ty widzisz, kto i kiedy wszedł.

Podobne funkcje ochrony hasłem dla wdrożeń mają platformy hostingu stron statycznych, takie jak Netlify czy Vercel — zwykle w płatnych planach.

Najczęstsze błędy przy zabezpieczaniu strony hasłem

  • Hasło w JavaScripcie. Skrypt typu if (haslo === "tajne") nie chroni niczego: hasło i treść są w kodzie źródłowym strony.
  • Brak HTTPS. W Basic Auth login i hasło są tylko zakodowane w Base64 i wysyłane z każdym żądaniem. Bez certyfikatu TLS może je podsłuchać każdy w tej samej sieci.
  • Słabe lub wspólne hasło. Hasło „klient2026” udostępnione mailem dziesięciu osobom to żadne zabezpieczenie. Jak tworzyć mocne hasła, wyjaśniamy w poradniku o bezpiecznych hasłach.
  • Hasła w postaci jawnej. W .htpasswd zawsze zapisuj skrót (bcrypt lub APR1-MD5). Dlaczego skrót, a nie szyfrowanie — tłumaczymy w tekście o funkcji skrótu kryptograficznego.
  • Zapomniana kopia strony. Wersja testowa chroniona hasłem, ale kopia zapasowa backup.zip w katalogu publicznym — dostępna dla wszystkich.

Wskazówka: Ochrona hasłem nie zastępuje aktualizacji i zapory aplikacyjnej. Basic Auth zatrzyma przypadkowych gości i boty, ale strona publiczna potrzebuje też ochrony przed atakami na formularze i luki we wtyczkach — więcej w artykule Co to jest WAF.

Jak sprawdzić, czy ochrona działa

  1. Otwórz stronę w oknie prywatnym przeglądarki — powinno pojawić się okno logowania lub formularz hasła.
  2. Sprawdź kod odpowiedzi z terminala: curl -I https://staging.example.com powinno zwrócić 401 Unauthorized, a curl -I -u jan:haslo https://staging.example.com — 200 OK.
  3. Spróbuj otworzyć bezpośredni adres pliku z chronionego katalogu (np. obrazka lub PDF-a), żeby upewnić się, że też wymaga hasła.
  4. Po zakończeniu prac nad stroną usuń ochronę i sprawdź, czy wersja produkcyjna nie ma przypadkiem dyrektyw blokujących robota Google.

Najczęściej zadawane pytania

Jak zabezpieczyć stronę hasłem bez znajomości programowania?

Skorzystaj z panelu hostingu: w cPanelu opcja nazywa się Directory Privacy (Prywatność katalogu), w DirectAdmin Password Protected Directories. Wskazujesz katalog, ustawiasz login i hasło, a panel sam tworzy pliki .htaccess i .htpasswd.

Czy strona chroniona hasłem jest indeksowana przez Google?

Nie, jeśli ochrona działa po stronie serwera. Robot Google dostaje odpowiedź 401 i nie widzi treści. Przy wbudowanej ochronie wpisów w WordPressie indeksowany może być tytuł, ale nie chroniona treść.

Gdzie umieścić plik .htpasswd?

Najlepiej poza katalogiem publicznym strony, np. w katalogu domowym konta nad public_html. W dyrektywie AuthUserFile podajesz pełną, bezwzględną ścieżkę do pliku.

Czy ochrona hasłem w WordPressie chroni też pliki w Mediach?

Nie. Wbudowana ochrona wpisu ukrywa tylko jego treść. Obrazki i pliki PDF wgrane do biblioteki mediów nadal są dostępne pod bezpośrednim adresem, jeśli ktoś go zna.

Jak wpuścić siebie bez hasła, a innych z hasłem?

W Apache 2.4 użyj bloku RequireAny z regułą Require ip dla swojego adresu i Require valid-user dla pozostałych. W nginx służy do tego dyrektywa satisfy any z allow i auth_basic.

CZ

Autor

Czarek Zawolski

Założyciel i redaktor XAD.pl. Pisze o sieciach, bezpieczeństwie IT, administracji systemami Windows i Linux oraz o sprzęcie, który sprawia ludziom problemy na co dzień.