~/www cat jak-zabezpieczyc-strone-www-haslem.md
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ć.

~ xad tldr jak-zabezpieczyc-strone-ww…
- 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.
$ tree --spis-tresci
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ć
| Sytuacja | Najlepsza metoda | Poziom ochrony |
|---|---|---|
| Strona w budowie, wersja testowa (staging) | Basic Auth w Apache/nginx lub w panelu hostingu | wysoki — nic nie wycieka przed podaniem hasła |
| Katalog z plikami dla klienta | Basic Auth na katalog | wysoki |
| Pojedynczy wpis lub strona w WordPressie | wbudowana ochrona hasłem | średni — chroni treść, ale nie pliki z Mediów |
| Cała witryna WordPress dla wąskiego grona | wtyczka (np. Password Protected) lub Basic Auth | średni–wysoki |
| Dostęp dla zespołu z kontrolą, kto wchodzi | Cloudflare Access lub logowanie użytkowników | wysoki, 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
.htpasswdpoza 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. Jeśli chodzi Ci głównie o zdjęcia, przed przywłaszczeniem lepiej chroni je znak wodny dodany w WordPressie.
- 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
.htpasswdzawsze 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.zipw 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
- Otwórz stronę w oknie prywatnym przeglądarki — powinno pojawić się okno logowania lub formularz hasła.
- Sprawdź kod odpowiedzi z terminala:
curl -I https://staging.example.compowinno zwrócić401 Unauthorized, acurl -I -u jan:haslo https://staging.example.com—200 OK. - Spróbuj otworzyć bezpośredni adres pliku z chronionego katalogu (np. obrazka lub PDF-a), żeby upewnić się, że też wymaga hasła.
- Po zakończeniu prac nad stroną usuń ochronę i sprawdź, czy wersja produkcyjna nie ma przypadkiem dyrektyw blokujących robota Google.
~ man faq
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.
Ten artykuł jest częścią tematu
$ whoami
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ń.


