Disabilitare o Reindirizzare WP-login.php
Esiste un modo per impedire ai visitatori, sia loggati che non, di accedere a mysite.com/wp-login.php
?
Ho un form di login separato che è tutto ciò di cui abbiamo bisogno. So che posso riprogettare il form generato da wp-login
ma preferirei non doverci avere a che fare affatto. Ho provato vari filtri e hook ma non riesco a farlo reindirizzare. Ho anche provato a usare un redirect .htaccess
e ho scoperto che funziona, ma poi impedisce al mio form personalizzato di login/logout di funzionare.
Idee?

Dopo aver trovato questa domanda e testato alcune delle risposte, di seguito è riportata una versione "ripulita" di ciò che utilizzo in un ambiente di produzione.
Questa versione non genera alcun notice/errore e consente anche il funzionamento del reset della password:
// Aggancia l'azione appropriata di WordPress
add_action('init', 'prevent_wp_login');
function prevent_wp_login() {
// WP tiene traccia della pagina corrente - globalizza la variabile per accedervi
global $pagenow;
// Verifica se $_GET['action'] è impostato e, in tal caso, lo carica nella variabile $action
$action = (isset($_GET['action'])) ? $_GET['action'] : '';
// Controlla se siamo nella pagina di login e assicura che l'azione non sia 'logout'
if( $pagenow == 'wp-login.php' && ( ! $action || ( $action && ! in_array($action, array('logout', 'lostpassword', 'rp', 'resetpass'))))) {
// Carica l'URL della home page
$page = get_bloginfo('url');
// Reindirizza alla home page
wp_redirect($page);
// Interrompe l'esecuzione per evitare il caricamento della pagina per qualsiasi motivo
exit();
}
}

Questo sembra prevenire l'accesso a WP-Login (bene) ma il finale exit() sembra impedire che il login() effettivo avvenga, il che non è ciò che vogliamo. Vogliamo che le persone possano accedere, ma semplicemente non vedano mai la schermata di login di WP. Se inseriscono una password errata, dovrebbe reindirizzare alla nostra pagina di login personalizzata.

Modificato e ora funziona: devi verificare se $action è compilato prima di fare in_array()

@Mike - Sei sicuro che il tuo hook stia funzionando? Cosa succede se inserisci echo "HERE";
all'interno della funzione? Viene visualizzato?

@cale_b Sì, l'hook funziona correttamente. Il problema è che $_GET['action']
risulta vuoto nel mio caso. Il form viene inviato a /wp-login.php
(senza alcuna variabile GET nell'URL) e osservando il sorgente non c'è nemmeno un input chiamato action
, quindi anche $_REQUEST['action']
risulta vuoto.

@cale_b Sembra che il codice sopra venga elaborato dopo che il login è già avvenuto. Se faccio un exit;
(prima del wp_redirect
) e aggiorno la pagina, non ricevo alcun avviso riguardo al reinvio delle variabili POST al server, il che significa che il server ha già eseguito un redirect. E se aggiorno nuovamente dopo, risulta che sono loggato.

@Mike - due cose: 1) questo non è pensato per impedire il login, ma per impedire l'accesso a wp-login.php (la pagina di login predefinita di WP), e 2) ho modificato la risposta e aggiustato leggermente la logica, che dovrebbe risolvere il problema da te descritto sopra.

Sono nuovo sia con PHP che con WordPress. La mia domanda è: nel tuo codice, dove devo inserire il link per la mia pagina di login/profilo personalizzata?

Questo impedisce semplicemente a chiunque di effettuare il login per me, quando si utilizza wp_login_form su una pagina personalizzata. Non permetterà mai l'accesso, sia con credenziali valide che non.

funziona per me ma ho problemi di logout e non riesco a capire perché

Sì, questo blocca il mio modulo di login personalizzato. Ma se ci fosse un modo per verificare in modo affidabile la variabile di richiesta o forse il referer? In altre parole: questo potrebbe essere un punto di partenza. Qualcun altro? Grazie ---JC

Ah sì, wp-login gestisce effettivamente il logout. Lol. È logico. Forse questo codice con un plugin sarà sufficiente. Vediamo cos'altro possiamo usare perché odio usare wp-login.

Penso che tutto ciò che sia necessario sia monitorare le variabili della richiesta quando wp-login viene caricato. Solo che al momento non ho un computer in grado di farlo.

Sto usando un plugin di Buddypress che reindirizza da wp-login a una pagina di login personalizzata. Potresti voler dare un'occhiata al codice per vedere come viene fatto. Si chiama Branded Login for Buddypress, sviluppato da Brajesh Singh su (buddydev.com)

Utilizzo il plugin WordPress Rename wp-login.php da diverso tempo.
Ti permette di cambiare il percorso wp-login.php
con qualsiasi altro percorso. Avevo dei bot che attaccavano ripetutamente le mie pagine di login, e ora non ricevo più alcun accesso.

WP-login gestisce il login, il logout, la registrazione, il reset e il recupero della password. Supponendo che tu voglia modificare la pagina di login front-end. Puoi utilizzare in sicurezza il seguente codice:
function custom_login_page() {
$new_login_page_url = home_url( '/login/' ); // nuova pagina di login
global $pagenow;
if( $pagenow == "wp-login.php" && $_SERVER['REQUEST_METHOD'] == 'GET') {
wp_redirect($new_login_page_url);
exit;
}
}
if(!is_user_logged_in()){
add_action('init','custom_login_page');
}
Questo snippet di codice farà:
- Reindirizzerà tutti i visitatori del sito alla nuova pagina di login
- Il logout funzionerà senza problemi
- Sulla tua pagina di login personalizzata dovrai creare form personalizzati per login, registrazione e reset password. Tuttavia, i tuoi form personalizzati possono inviare i dati in sicurezza a wp-login.php poiché le richieste POST non vengono reindirizzate.

home_url()
aggiunge già uno slash iniziale, quindi non è necessario. Inoltre $pagenow
è (a) una variabile globale presente solo nell'area di amministrazione (e forse nel login) e (b) dovrebbe essere sostituita con controlli sulle proprietà di get_current_screen()
.

// https://codex.wordpress.org/Plugin_API/Filter_Reference/login_url#Examples
add_filter('login_url', 'custom_login_url', 10, 3);
function custom_login_url($login_url, $redirect, $force_reauth) {
return home_url('/login/?redirect_to=' . $redirect);
}
Questo reindirizzerà a /login invece del brutto modulo wp-login.

Se la tua intenzione è proteggere wp-login.php
impedendo addirittura che estranei possano vederlo, il modo più semplice ed efficiente per farlo è richiedere un'autenticazione (autenticazione di base) per accedere a wp-login.php
.
In Apache, l'autenticazione viene implementata tramite una combinazione di htaccess e un file delle password. La prima volta, all'interno di una sessione del browser, che qualcuno tenta di accedere a wp-login.php
, gli verrà chiesto di inserire un nome utente e una password (prima del login di WordPress).
Per semplificare le cose, questo nome utente e password possono essere gli stessi per ogni persona a cui vuoi concedere l'accesso a wp-login.php
, dato che dovranno comunque inserire il loro login di WordPress dopo aver superato con successo la prima finestra di dialogo di autenticazione.

Interessante. Presumo che il 'prompt' sia il popup modale del browser per inserire le credenziali. Penso che questo possa causare confusione. Idealmente, ciò che vorrei è che quell'URL non faccia -nulla-... o magari semplicemente reindirizzi alla home page. Ma grazie per l'informazione. Si impara qualcosa di nuovo ogni giorno!

Quello che pensi di fare è "sicurezza attraverso l'oscurità". Ma in realtà stai solo facendo oscurità, e questo è terribile. Non usarlo. L'autenticazione è sicurezza. Nascondere il punto di ingresso è oscurità. http://security.stackexchange.com/questions/32064/at-what-point-does-something-count-as-security-through-obscurity

In altre parole, anche SE cambi la posizione di wp-login, hai comunque bisogno di usare l'autenticazione: "Dovrei affidarmi al cambiamento del server dalla porta 22 alla 2222 per mantenere la mia connessione sicura? Assolutamente no. È male cambiare il mio server SSH alla porta 2222 mentre uso anche una password? No, semmai questa è la soluzione migliore. Cambiare ("oscurando") la porta semplicemente ridurrà un sacco di scanner automatici di exploit che cercano sulle porte normali. Otteniamo un vantaggio di sicurezza attraverso l'oscurità che è buono, ma non stiamo contando sull'oscurità. Se la trovano, devono comunque craccare la password."

Sostituisci $pageid
con la pagina a cui vuoi reindirizzare gli utenti
/* Reindirizza la pagina di login */
function redirect_login_page(){
// Memorizza per verificare se questa pagina è uguale a wp-login.php
$page_viewed = basename( $_SERVER['REQUEST_URI'] );
// permalink alla pagina di login personalizzata
$login_page = get_permalink($pageid);
if( $page_viewed == "wp-login.php" ) {
wp_redirect( $login_page );
exit();
}
}
add_action( 'init','redirect_login_page' );

<?php
/* Template Name: Template di Registrazione */
if(is_user_logged_in()) { $user_id = get_current_user_id();$current_user = wp_get_current_user();$profile_url = get_author_posts_url($user_id);$edit_profile_url = get_edit_profile_url($user_id); ?>
<div class="regted">
Sei loggato con il nickname <a href="<?php echo $profile_url ?>"><?php echo $current_user->display_name; ?></a> Vuoi <a href="<?php echo esc_url(wp_logout_url($current_url)); ?>">Uscire</a> ?
</div>
<?php } else { ?>
<div class="register">
<?php $err = ''; $success = ''; global $wpdb, $PasswordHash, $current_user, $user_ID; if(isset($_POST['task']) && $_POST['task'] == 'register' ) { $pwd1 = $wpdb->escape(trim($_POST['pwd1']));
$pwd2 = $wpdb->escape(trim($_POST['pwd2']));
$email = $wpdb->escape(trim($_POST['email']));
$username = $wpdb->escape(trim($_POST['username']));
if( $email == "" || $pwd1 == "" || $pwd2 == "" || $username == "") {
$err = 'Per favore inserisci la password in questo campo';
} else if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$err = 'Email non valida';
} else if(email_exists($email) ) {
$err = 'Email già esistente';
} else if($pwd1 <> $pwd2 ){
$err = 'La password non corrisponde alla conferma password';
} else {
$user_id = wp_insert_user( array ('user_pass' => apply_filters('pre_user_user_pass', $pwd1), 'user_login' => apply_filters('pre_user_user_login', $username), 'user_email' => apply_filters('pre_user_user_email', $email), 'role' => 'subscriber' ) );
if( is_wp_error($user_id) ) {
$err = 'Errore nella creazione dell\'utente.';
} else {
do_action('user_register', $user_id);
$success = 'Registrazione avvenuta con successo';
}
}
}
?>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<!--mostra messaggio di errore/successo-->
<div id="message">
<?php
if(! empty($err) ) :
echo ''.$err.'';
endif;
?>
<?php
if(! empty($success) ) :
$login_page = home_url( '/login' );
echo ''.$success. '<a href='.$login_page.'> Login</a>'.'';
endif;
?>
</div>
<div class="container">
<div id="loginbox" style="margin-top:100px;" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
<div style="padding-bottom: 50px;" class="col-md-6 col-md-offset-4 col-sm-8 col-sm-offset-2"/><img src="#url.logo" alt="Logo del sito" title="Logo"></div>
<form class="form-horizontal" method="post" role="form">
<div class="form-group">
<label class="control-label col-sm-3" for="username">Username:</label>
<div class="col-sm-9">
<input type="text" class="form-control" name="username" id="username" placeholder="Username">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="email">Email:</label>
<div class="col-sm-9">
<input type="email" class="form-control" name="email" id="email" placeholder="Email">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="pwd1">Password</label>
<div class="col-sm-9">
<input type="password" class="form-control" name="pwd1" id="pwd1" placeholder="Inserisci la tua password">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="pwd2">Ripeti password:</label>
<div class="col-sm-9">
<input type="password" class="form-control" name="pwd2" id="pwd2" placeholder="Ripeti password">
</div>
</div>
<?php wp_nonce_field( 'post_nonce', 'post_nonce_field' ); ?>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9" style="text-align:center;">
<button type="submit" class="btn btn-primary">Registrati</button>
<input type="hidden" name="task" value="register" /><br/>
</div>
</div>
</form>
</div>
</div>
</div>
<?php
get_footer();
?>
<div class="message">
<?php
$login = (isset($_GET['login']) ) ? $_GET['login'] : 0;
if ( $login === "failed" ) {
echo '<strong>Errore</strong> Username o password errati!';
} elseif ( $login === "empty" ) {
echo '<strong>Errore:</strong>Username o password sono campi vuoti.';
} elseif ( $login === "false" ) {
echo '<strong>ERRORE:</strong> Uscita';
}
?>
</div>
<?php } ?>
Esempio della mia pagina di login personalizzata. Salva login.php e inserisci il codice
add_action('init','wpse_login');
function wpse_login(){
global $pagenow;
if( 'wp-login.php' == $pagenow && !is_user_logged_in()) {
wp_redirect('http://yoursite.com/login.php');
exit();
}
}
nel file functions.php

Potresti per favore modificare la tua domanda e spiegare perché questa risposta è migliore delle precedenti o cosa stai facendo esattamente? Le risposte con solo codice sono generalmente malviste senza una qualche forma di spiegazione.

questo codice cambia wp-login.php in login.php con il mio codice personalizzato basato su bootstrap. Può prevenire bot automatici o tentativi di indovinare l'URL predefinito. L'utente può cambiare <i>login</i> con la frase che preferisce e nessuno conoscerà direttamente l'URL di login tranne te.

add_action('check_admin_referer', 'logout_without_confirm', 10, 2); function logout_without_confirm($action, $result) { /* * Permette il logout senza conferma / if ($action == "log-out" && !isset($_GET['_wpnonce'])) { $redirect_to = isset($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'https://yourdomain.com'; $location = str_replace('&', '&', wp_logout_url($redirect_to)); header("Location: $location"); die; } }
