Come disattivare la possibilità di login in WordPress
Durante un vasto attacco brute force, vorrei disattivare completamente la possibilità di accedere a WordPress. L'unico account sul sito è il mio, quindi non c'è motivo per cui i visitatori debbano accedere e non danneggerebbe la loro esperienza sul sito.
Quando ho bisogno di accedere, posso rimuovere il codice. In alternativa, posso limitare gli accessi solo al mio indirizzo IP.
Sto cercando di ottenere questo risultato intercettando un tentativo di accesso il prima possibile con il seguente codice
if (isset($_POST['pwd']) || isset($_GET['pwd'])) {
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
echo 'Gli accessi al sito sono disabilitati';
die();
}
È un approccio rudimentale ma dovrebbe funzionare. Tuttavia, alcuni tentativi di accesso riescono ancora a passare e non so da dove potrebbero provenire.
In che altro modo WordPress accetta gli accessi, se non con il campo 'pwd'?
Esiste una convenzione esistente per disabilitare gli accessi?
Modifica: oltre a bloccare wp-login.php, ho eliminato xmlrpc.php che veniva utilizzato come un altro punto di ingresso per gli attacchi brute force. La mia configurazione attuale non ne ha bisogno, ma la tua potrebbe. Assicurati di non averne bisogno prima di disabilitarlo.

Il fallimento dell'autenticazione dovrebbe funzionare per tutti i tipi possibili di autenticazione - modulo di login, xmlrpc, ajax, ecc.
Modifica: in realtà ho realizzato che c'è un modo per evitare di inviare la query relativa all'utente al database
function wpse208677_authenticate($user,$username,$pass) {
remove_filter('authenticate','wp_authenticate_username_password',20,3);
return null;
// se vuoi inserire nella whitelist il tuo ip verificalo e restituisci $user
}
add_filter('authenticate','wpse208677_authenticate', 10,3)

È utile, ma sto cercando un modo per interrompere il login fin dall'inizio. Ho Sucuri e un altro plugin che mi avvisano sugli attacchi brute force. Sono preoccupato che questo potrebbe comunque attivare le azioni su quei plugin.

@MichaelKhalili, non puoi realisticamente farlo poiché i tentativi di login possono provenire da varie fonti. Se vuoi bloccare solo wp-login.php o xmlrpc.php, dovresti farlo a livello di configurazione del webserver (htaccess in Apache può fare al caso tuo) senza far eseguire affatto il PHP. L'unico codice PHP comparabile (a livello di prestazioni) richiederebbe una modifica di wp-config.php, un file che dovresti evitare di modificare il più possibile. Qualsiasi altra soluzione basata su PHP non sarà migliore a livello di prestazioni rispetto alla risposta data.

Ho risolto da quando ho postato la domanda e ho aggiornato il mio post. Posso inserire il codice che cerca $_POST['pwd'] in un plugin must-use (mu-plugins) e disabilitare xmlrpc.php. Sembra funzionare. Ho bloccato la maggior parte degli attacchi con $_POST['pwd'] e il resto dopo aver disabilitato xmlrpc.php.

Il problema con l'eliminazione dei file è che torneranno quando effettui un aggiornamento. Meglio bloccarli in htaccess se non usi xmlrpc

Ottimo punto Mark. Penso ci sia anche un'impostazione per disattivare il supporto xmlrpc all'interno di WordPress. Devo però ritagliarmi del tempo per testarlo. Non sono nemmeno sicuro di quale sia il meccanismo di login all'interno di quel file.

Per quanto riguarda la disabilitazione sicura di XML-RPC, ho scoperto che puoi disabilitarlo usando un filtro add_filter('xmlrpc_enabled', '__return_false'); Ci sono anche diversi plugin che lo fanno per te. Io ho usato questo https://wordpress.org/plugins/disable-xml-rpc/

La risposta principale qui è un codice PHP terribilmente pessimo, completamente rotto. Ecco una versione corretta. I miei punti di reputazione sono troppo bassi per commentare la risposta originale.
Questo codice può essere inserito in fondo al file wp-config.php
in caso di necessità.
function wpse208677_authenticate($user,$username,$pass) {
remove_filter('authenticate','wp_authenticate_username_password',20,3);
return null;
// se vuoi permettere l'accesso solo a determinati IP, verificalo e restituisci $user
}
add_filter('authenticate','wpse208677_authenticate', 1,3)
Un'altra opzione è impedire l'accesso alle pagine di login/registrazione. Funziona anche con un URL di login nascosto per WordPress. Questo codice può essere inserito all'inizio di wp-config.php
(dopo l'apertura <?php
).
if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
die('Sito in modalità manutenzione.');
}

Mi dispiace ma è un'idea molto sbagliata inserire il codice nel file wp-config.php
. Inoltre, non vedo in che modo il tuo codice sia diverso dall'altra risposta?

La risposta precedente di Mark K è stata aggiornata da te, Jack, ieri, correggendo l'errore di battitura che avevo corretto io.
È una cattiva idea inserire codice in wp-config, questo era per uno scenario di emergenza per qualcuno che sa cosa sta facendo. Prima interveniamo, meno risorse WordPress deve caricare per bloccare gli accessi.

Chiunque stia considerando questo dovrebbe ricordare che le richieste ajax pubbliche vengono ancora effettuate nella directory wp-admin. Se il tuo sito utilizza ajax, dovresti sbloccare il percorso verso admin-ajax.php

E dato che WP utilizza AJAX nel core, questo non dovrebbe essere fatto in nessun caso.

Concordo che non sia la soluzione per "disabilitare" la registrazione/accesso degli utenti, che è la domanda qui. Ma @kaiser, perché dici che non dovrebbe essere fatto? Io lo faccio su due siti che gestisco personalmente dove non è abilitata la registrazione utenti. Uso anche la protezione via password in .htaccess per il file wp-login.php. Se configurato correttamente, le richieste Ajax e altre cose da wp-admin (JS, CSS, immagini) non sono affatto un problema e può ridurre drasticamente le possibilità di successo degli attacchi brute force.

No, non l'ho fatto. Questa è un'altra opzione ma è meno sicura, l'URL di amministrazione del sito può essere facilmente scoperto, indipendentemente dal nome che gli hai dato. Comunque, questo non spiega perché bloccare l'accesso a quella posizione non dovrebbe essere fatto affatto. Inoltre, non vedo come cambiare il nome sia meglio che bloccare l'accesso a una certa posizione. Nota che il contesto è che nessuno tranne te accederà lì, perché bloccare l'accesso a tutti gli altri è negativo? Attualmente, nel caso in cui solo tu sia autorizzato ad accedere a wp-admin, bloccherei wp-admin con .htaccess anche se il nome è cambiato.
