Disabilita o reindirizza WP-login.php


10

Esiste un modo per impedire ai visitatori, connessi o meno, di raggiungere mysite.com/wp-login.php?

Ho un modulo di accesso separato che è tutto ciò di cui abbiamo bisogno. So di poter riprogettare il modulo generato da wp-loginma preferirei non doverlo gestire affatto. Ho provato vari filtri e hook e non riesco a reindirizzarlo. Ho anche provato a utilizzare un .htaccessreindirizzamento e ho scoperto che funziona, ma poi impedisce al mio modulo di accesso / disconnessione personalizzato di funzionare.

Idee?


lo stai facendo per motivi di sicurezza? perché non implementare auth solo per wp-login.php?
Gaia,

Non so cosa intendi con questo. Si prega di espandere un po '. TIA.
jchwebdev,

PERCHÉ è necessario un modulo di accesso separato? per motivi di sicurezza?
Gaia,

Scopriamo che troppe persone al giorno d'oggi sono a conoscenza del "wp-login". Preferiremmo non essere così ovvio. Puoi dirmi cosa significa "perché non implementare auth"? TIA
jchwebdev,

vedi risposta fornita.
Gaia,

Risposte:


18

Dopo aver trovato questa domanda e testato alcune delle risposte, la seguente è una versione "ripulita" di ciò che sto usando in un ambiente di produzione.

Questa versione non genera alcun avviso / errore e consente anche il ripristino delle password:

// Hook the appropriate WordPress action
add_action('init', 'prevent_wp_login');

function prevent_wp_login() {
    // WP tracks the current page - global the variable to access it
    global $pagenow;
    // Check if a $_GET['action'] is set, and if so, load it into $action variable
    $action = (isset($_GET['action'])) ? $_GET['action'] : '';
    // Check if we're on the login page, and ensure the action is not 'logout'
    if( $pagenow == 'wp-login.php' && ( ! $action || ( $action && ! in_array($action, array('logout', 'lostpassword', 'rp', 'resetpass'))))) {
        // Load the home page url
        $page = get_bloginfo('url');
        // Redirect to the home page
        wp_redirect($page);
        // Stop execution to prevent the page loading for any reason
        exit();
    }
}

Questo sembra impedire WP-Login (buono), ma l'uscita finale () sembra impedire che si verifichi effettivamente il login () che non è quello che vogliamo. Vogliamo che le persone siano in grado di accedere, semplicemente non vedono mai la schermata WP-Login. Se inseriscono una PW errata, dovrebbe reindirizzare alla nostra pagina di accesso personalizzata.
jchwebdev,

Modificato e ora funziona: devi controllare se $ action è pieno prima di fare in_array ()
simonthesorcerer

Questo non ha funzionato per me. Potrei ancora accedere.
Mike

@Mike - Sei sicuro che il tuo gancio stia prendendo / funzionando? Cosa succede se si inserisce echo "HERE";la funzione? Fa eco?
random_user_name

1
@cale_b Sì, l'hook funziona bene. Il problema è che $_GET['action']è vuoto per me. Il modulo viene pubblicato /wp-login.php(senza alcuna variabile GET nell'URL) e guardando l'origine non c'è nemmeno un nome put action, quindi $_REQUEST['action']è anche vuoto.
Mike,

10

Prova questo nelle funzioni.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://yoursite.com/');
  exit();
 }
}

sto

7
Perché anche wp-login.php gestisce la disconnessione.
Brian Fegter,

Sì, questo blocca il mio modulo di accesso personalizzato. Ma se esistesse un modo per verificare in modo affidabile la richiesta var o forse il referer? IOW: questo potrebbe essere un punto di partenza. Chiunque altro? TIA --- JC
jchwebdev

Ah sì, wp-login gestisce la disconnessione. Lol. Questo è logico. Forse questo codice con un plugin sarà sufficiente. Fammi vedere cos'altro possiamo usare perché odio usare wp-login.
Androliyah,

Tutto ciò che ritengo necessario sarebbe monitorare le richieste vars quando viene caricato wp-login. Semplicemente non ho una macchina che possa farlo proprio ora.
jchwebdev,

3

Aggiungi un GET var per l'azione di disconnessione e funziona benissimo.

add_action('init','custom_login');

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

Finora, questo è il più vicino a ciò che vogliamo. Se rimuoviamo exit () e cambiamo wp_redirect nella nostra pagina di accesso personalizzata, sembra fare il lavoro.
jchwebdev,

3

Ho usato il plugin WordPress Rinomina wp-login.php per un po 'di tempo.

Ti consente di passare wp-login.phpa qualsiasi altro percorso. Avevo dei robot che sbattevano le mie pagine di accesso e ora ho zero hit.


1

WP-login gestisce login, logout, registrazione, reimpostazione e recupero della password. Supponendo di voler modificare la pagina di accesso del front-end. Puoi tranquillamente usare il seguente codice:

function custom_login_page() {
 $new_login_page_url = home_url( '/login/' ); // new login page
 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 frammento di codice:

  1. Reindirizza tutti i visitatori del sito Web alla nuova pagina di accesso.
  2. La disconnessione funzionerà senza alcun problema
  3. Nella tua pagina di accesso personalizzata dovrai creare moduli di accesso, registrazione e reimpostazione della password personalizzati, tuttavia i tuoi moduli personalizzati possono pubblicare dati su wp-login.php in modo sicuro poiché le richieste di post non vengono reindirizzate.

1
home_url()aggiunge già una barra iniziale, quindi non è necessario. Inoltre $pagenowè (a) un globale presente solo su admin (e forse il login) e (b) dovrebbe essere sostituito con get_current_screen()controlli di proprietà.
Kaiser

1
// 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.


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

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

0

Se la tua intenzione è quella di proteggere wp-login.phpdagli estranei anche la possibilità di vederlo, il modo più semplice ed efficace per farlo è richiedere l'autorizzazione (autenticazione di base) per accedere wp-login.php.

In Apache, auth è implementato tramite una combinazione di htaccess e un file di password . La prima volta, all'interno di una sessione del browser, a chiunque tenti di accedere wp-login.php, verrà richiesto di inserire un nome utente e una password (prima dell'accesso a wordpress).

Per semplificare le cose, questo nome utente e password possono essere gli stessi per ogni persona a cui vuoi dare accesso wp-login.php, poiché devono comunque inserire il loro login in wordpress dopo aver superato con successo la prima finestra di dialogo di autenticazione.


Interessante. Suppongo che il "prompt" sia il popup modale del browser per l'inserimento delle credenziali. Penso che ciò causerebbe confusione. Idealmente quello che voglio è che quell'URL faccia -nulla -... o forse reindirizzi alla home page. Ma grazie per quello. Impara qualcosa di nuovo ogni giorno!
jchwebdev,

Quello che pensi di fare è "sicurezza attraverso l'oscurità". Ma in realtà stai solo facendo oscurità, e questo è terribile. Non usarlo. Auth è sicurezza. Nascondere il punto di ingresso è oscurità. security.stackexchange.com/questions/32064/…
Gaia

1
In altre parole, anche se cambi la posizione di wp-login, devi comunque usare auth: "Devo fare affidamento sulla modifica del server dalla 22 alla porta 2222 per mantenere la mia connessione sicura? Assolutamente no. È male cambiare la mia Il server SSH sulla porta 2222 utilizza anche una password? No, semmai questa è la soluzione migliore. Cambiando ("oscurando") la porta si ridurrà semplicemente su un mucchio di scanner di exploit automatici che cercano porte normali. Otteniamo un vantaggio in termini di sicurezza attraverso oscurità che è buona, ma non contiamo sull'oscurità. Se l'hanno trovata devono ancora decifrare la password. "
Gaia,

Grazie per quello Ho imparato molto. Non quello che stavo cercando, ma comunque ... molto utile. Migliore --- JC
jchwebdev

0

Sostituisci $pageidcon la pagina in cui desideri reindirizzare gli utenti

/* Redirect log in page */
function redirect_login_page(){
  // Store for checking if this page equals wp-login.php
   $page_viewed = basename( $_SERVER['REQUEST_URI'] );

  // permalink to the custom login page
  $login_page  = get_permalink($pageid);

  if( $page_viewed == "wp-login.php" ) {
    wp_redirect( $login_page );
    exit();
  }
}

add_action( 'init','redirect_login_page' );

0
<?php
/* Template Name: Register Template */
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">
    You're login with nickname <a href="<?php echo $profile_url ?>"><?php echo $current_user->display_name; ?></a> Are you want to <a href="<?php echo esc_url(wp_logout_url($current_url)); ?>">Exit</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 = 'Please enter password in this field';
        } else if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $err = 'Email is invalid';
        } else if(email_exists($email) ) {
            $err = 'Email is existed';
        } else if($pwd1 <> $pwd2 ){
            $err = 'Password does not match the confirm 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 = 'Error on user creation.';
            } else {
                do_action('user_register', $user_id);
                $success = 'Registered Successfully';
            }
        }
    }
    ?>
  <link  rel="stylesheet" type="text/css"  href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<!--display error/success message-->
<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"></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="Enter your password">
    </div>
</div>
<div class="form-group">
    <label class="control-label col-sm-3" for="pwd2">Retype password:</label>
    <div class="col-sm-9">
        <input type="password" class="form-control" name="pwd2" id="pwd2" placeholder="Retype 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">Register</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>Error</strong> Wrong username or password!';
        } elseif ( $login === "empty" ) {
                echo '<strong>Error:</strong>Username or password is blank field.';
        } elseif ( $login === "false" ) {
                echo '<strong>ERROR:</strong> Exit';
        }
    ?>
</div>
<?php } ?>

Esempio la mia pagina di accesso personalizzata. Salvataggio di login.php e inserimento del 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();
 }
}

in functions.php


Potresti modificare la tua domanda e spiegare perché questa risposta è migliore delle risposte precedenti o cosa stai facendo esattamente quello che stai facendo. Le risposte solo al codice sono generalmente disapprovate senza una sorta di spiegazione.
Howdy_McGee

questo codice passa da wp-login.php a login.php con il mio codice personalizzato basato su bootstrap Può impedire l'auto bot o indovinare l'URL predefinito. use può cambiare <i> login </i> per pronunciare ciò che vuoi. e nessuno sa direttamente che l'URL di login ti strappa.
Rei
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.