Disabilitare o Reindirizzare WP-login.php

24 ago 2012, 05:05:31
Visualizzazioni: 93.9K
Voti: 14

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?

6
Commenti

lo fai per motivi di sicurezza? perché non implementare l'autenticazione solo per wp-login.php?

Gaia Gaia
20 mag 2013 21:13:58

Non capisco cosa intendi. Per favore, spiegati meglio. Grazie.

jchwebdev jchwebdev
21 mag 2013 21:38:00

PERCHÉ hai bisogno di un modulo di login separato? per motivi di sicurezza?

Gaia Gaia
22 mag 2013 04:05:44

Troviamo che troppe persone al giorno d'oggi siano a conoscenza del 'wp-login'. Preferiremmo che non fosse così ovvio.

Puoi semplicemente dirmi cosa significa 'perché non implementare l'autenticazione'? Grazie in anticipo.

jchwebdev jchwebdev
22 mag 2013 23:09:35

vedi la risposta fornita.

Gaia Gaia
23 mag 2013 00:47:14

se hai trovato una soluzione, segnala come accettata.

Gaia Gaia
23 mag 2013 22:31:08
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 9
11
27

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();
    }
}
4 lug 2014 00:45:24
Commenti

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.

jchwebdev jchwebdev
15 lug 2014 21:52:35

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

simonthesorcerer simonthesorcerer
22 lug 2014 00:45:07

Questo non ha funzionato per me. Potevo ancora accedere.

Mike Mike
3 ott 2015 06:43:13

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

random_user_name random_user_name
3 ott 2015 17:41:07

@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.

Mike Mike
4 ott 2015 01:24:50

@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 Mike
4 ott 2015 02:14:50

@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.

random_user_name random_user_name
4 ott 2015 17:55:31

Testato e funziona!

Dale Clifford Dale Clifford
24 mar 2018 10:55:44

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?

Aousaf Rashid Aousaf Rashid
17 gen 2019 18:40:50

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.

Nathan Nathan
21 mag 2019 20:18:09

Solo un GRAZIE enorme. Ci stavo armeggiando tutto il giorno da solo.

Juergen Schulze Juergen Schulze
3 giu 2020 17:10:48
Mostra i restanti 6 commenti
6
11

Prova questo nel file functions.php del tuo tema

add_action('init','custom_login');

function custom_login(){
 global $pagenow;
 if( 'wp-login.php' == $pagenow && !is_user_logged_in()) {
  wp_redirect('http://tuosito.com/');
  exit();
 }
}
24 ago 2012 06:06:45
Commenti

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

Androliyah Androliyah
24 ago 2012 06:26:09

Perché wp-login.php gestisce anche il logout.

Brian Fegter Brian Fegter
24 ago 2012 07:02:30

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

jchwebdev jchwebdev
24 ago 2012 10:15:28

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.

Androliyah Androliyah
24 ago 2012 22:12:30

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.

jchwebdev jchwebdev
25 ago 2012 03:34:09

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)

Androliyah Androliyah
25 ago 2012 16:43:40
Mostra i restanti 1 commenti
1

Aggiungi una variabile GET per l'azione di logout e funzionerà correttamente.

add_action('init','custom_login');

function custom_login(){
 global $pagenow;
 if( 'wp-login.php' == $pagenow && $_GET['action']!="logout") {
  wp_redirect('http://TUOSITO.com/');
  exit();
 }
}
20 apr 2014 23:20:46
Commenti

Finora, questa è la soluzione più vicina a ciò che vogliamo. Se rimuoviamo l'exit() e cambiamo il wp_redirect con la nostra pagina di login personalizzata, sembra fare il lavoro.

jchwebdev jchwebdev
15 lug 2014 22:11:32
0

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.

4 lug 2014 00:53:16
2

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à:

  1. Reindirizzerà tutti i visitatori del sito alla nuova pagina di login
  2. Il logout funzionerà senza problemi
  3. 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.
29 ott 2014 14:17:18
Commenti

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().

kaiser kaiser
29 ott 2014 14:41:31

Questa soluzione funziona al meglio. Grazie

ItsJhonny ItsJhonny
8 mar 2022 13:37:05
2
// 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.

11 gen 2017 17:12:13
Commenti

hmmm idea interessante, ma per favore spiega come/perché funziona

Mark Kaplun Mark Kaplun
11 gen 2017 17:25:28

Questo non funzionerà. Questo filtra le richieste per l'URL di login tramite login_url(), ma non impedisce a qualcuno di digitare manualmente wp-login.php.

Matt Matt
4 lug 2019 21:41:21
4

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.

23 mag 2013 00:46:59
Commenti

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!

jchwebdev jchwebdev
27 mag 2013 05:57:14

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

Gaia Gaia
27 mag 2013 14:50:01

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."

Gaia Gaia
27 mag 2013 15:41:56

Grazie per questo. Ho imparato molto. Non era quello che cercavo, ma comunque... molto utile. I migliori saluti ---JC

jchwebdev jchwebdev
31 mag 2013 06:51:22
0

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' );
6 gen 2017 10:36:49
3
<?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

18 ago 2017 05:25:31
Commenti

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.

Howdy_McGee Howdy_McGee
18 ago 2017 07:07:19

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.

Rei Rei
20 ago 2017 11:30:39

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; } }

Hercules S. Hercules S.
22 lug 2023 07:33:41