wp-login.php i wp-admin za pomocą hasła .htaccessJednym z najczęstszych źródeł obciążenia serwerów z WordPressem są automatyczne próby logowania do panelu administracyjnego. Boty wysyłają tysiące żądań typu POST /wp-login.php, co nie tylko spowalnia stronę, ale także zajmuje zasoby PHP i CPU. Najprostszym i zarazem najskuteczniejszym sposobem, by temu zapobiec, jest zabezpieczenie plików wp-login.php oraz katalogu wp-admin hasłem HTTP (Basic Auth) w pliku .htaccess.
wp-login.phpMechanizm Basic Auth działa jeszcze przed uruchomieniem PHP. Gdy ktoś próbuje wejść na stronę wp-login.php lub wp-admin, serwer Apache sprawdza, czy użytkownik przesłał poprawny nagłówek Authorization. Jeśli nie, odsyła odpowiedź 401 Unauthorized, a przeglądarka wyświetla okienko logowania.
Dzięki temu WordPress nie wykonuje żadnego kodu, a sam serwer odcina dostęp do plików jeszcze przed uruchomieniem interpretera PHP.
.htpasswdPlik .htpasswd powinien znajdować się poza katalogiem publicznym, np.:
/home/[USER]/.htpasswds/.htpasswd
Można go wygenerować poleceniem:
htpasswd -c /home/[USER]/.htpasswds/.htpasswd admin
lub online — za pomocą generatora https://pro-link.pl/md5
.htaccessW katalogu głównym WordPressa (public_html) należy dopisać na początku pliku .htaccess poniższy fragment:
<Files "wp-login.php">
AuthType Basic
AuthName "Protected Area"
AuthUserFile /home/[USER]/.htpasswds/.htpasswd
Require valid-user
</Files>
Ta reguła sprawia, że każde wejście na adres /wp-login.php będzie wymagało wcześniejszego podania loginu i hasła z pliku .htpasswd.
wp-adminW katalogu /wp-admin należy utworzyć lub uzupełnić plik .htaccess o wpis:
<FilesMatch "admin-ajax\.php|async-upload\.php">
Satisfy any
Allow from all
</FilesMatch>
AuthType Basic
AuthName "Protected Area"
AuthUserFile /home/[USER]/.htpasswds/.htpasswd
Require user username
Dzięki temu cały panel administracyjny (/wp-admin) również będzie wymagał logowania przez to samo hasło. Reguła FilesMatch pozwala przy tym zachować dostęp do plików AJAX potrzebnych WordPressowi do działania strony.

Po zapisaniu plików spróbuj wejść na adres:
https://[DOMAIN]/wp-login.php
Jeśli pojawi się okienko logowania przeglądarki (a nie formularz WordPressa), wszystko działa prawidłowo.
Można też sprawdzić z wiersza poleceń:
curl -I https://[DOMAIN]/wp-login.php
Odpowiedź powinna zawierać:
HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm="Protected Area"
Poniżej przykład realnego ataku brute-force widocznego w logach Apache:
157.230.45.41 - - [06/Nov/2025:08:54:54 +0100] "POST //wp-login.php HTTP/1.1" 200 11063 "https://<span class="mask">[DOMAIN]</span>//wp-login.php" "Mozilla/5.0 ..."
157.230.45.41 - - [06/Nov/2025:08:54:57 +0100] "POST //wp-login.php HTTP/1.1" 200 11063 "https://<span class="mask">[DOMAIN]</span>//wp-login.php" "Mozilla/5.0 ..."
83.3.53.218 - - [06/Nov/2025:09:07:05 +0100] "GET /wp-admin HTTP/2.0" 401 490 "-" "Mozilla/5.0 ..."
83.3.53.218 - - [06/Nov/2025:09:07:28 +0100] "GET //wp-login.php HTTP/2.0" 200 3531 "-" "Mozilla/5.0 ..."
Widać tu typowy schemat: bot wysyła kolejne zapytania do wp-login.php, ale katalog wp-admin od razu odpowiada kodem 401 — dzięki poprawnie ustawionej autoryzacji Basic Auth.
wp-login.php, jak i wp-admin..htpasswd dla obu lokalizacji..htpasswd poza katalog public_html — jest to bezpieczniejsze..htaccess.Zastosowanie prostego zabezpieczenia na poziomie serwera eliminuje 99% ataków typu brute-force i znacząco zmniejsza zużycie zasobów na hostingu. To jedna z najskuteczniejszych i najprostszych metod ochrony WordPressa.