Deshabilitar o redirigir WP-login.php

10

¿Hay alguna manera de evitar que los visitantes, ya sea que hayan iniciado sesión o no, lleguen mysite.com/wp-login.php?

Tengo un formulario de inicio de sesión separado que es todo lo que necesitamos. Sé que puedo cambiar el estilo del formulario generado, wp-loginpero prefiero no tener que lidiar con eso en absoluto. He probado varios filtros y ganchos y parece que no puedo redirigirlo. También intenté usar una .htaccessredirección y descubrí que esto funciona, pero luego evita que mi formulario de inicio / cierre de sesión personalizado funcione.

Ideas?

jchwebdev
fuente
¿Estás haciendo esto por razones de seguridad? ¿por qué no implementar auth solo para wp-login.php?
Gaia
No sé a qué te refieres con eso. Por favor, expande un poco. TIA
jchwebdev
¿POR QUÉ necesita un formulario de inicio de sesión separado? ¿por razones de seguridad?
Gaia
Descubrimos que demasiadas personas en estos días conocen el 'wp-login'. Preferiríamos que no sea tan obvio. ¿Puede decirme qué significa "por qué no implementar autenticación"? TIA
jchwebdev
ver respuesta provista.
Gaia

Respuestas:

18

Después de encontrar esta pregunta y probar algunas de las respuestas, la siguiente es una versión "limpia" de lo que estoy usando en un entorno de producción.

Esta versión no arroja ningún aviso / error, y también permite que los restablecimientos de contraseña funcionen:

// 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();
    }
}
nombre_usuario_aleatorio
fuente
Esto parece evitar WP-Login (bueno), pero la salida final () parece evitar que se produzca el inicio de sesión real (), lo que no es lo que queremos. Queremos que las personas puedan iniciar sesión, solo que nunca vean la pantalla WP-Login. Si ingresan un PW incorrecto, debe redirigirse a nuestra página de inicio de sesión personalizada.
jchwebdev
Lo editó y ahora está funcionando: debe verificar si $ action está lleno antes de hacer in_array ()
simonthesorcerer
Esto no funcionó para mí. Todavía podría iniciar sesión.
Mike
@ Mike - ¿Estás seguro de que tu gancho está tomando / funcionando? ¿Qué pasa si pones echo "HERE";dentro de la función? ¿Hace eco?
random_user_name
1
@cale_b Sí, el gancho funciona bien. El problema es que $_GET['action']está vacío para mí. El formulario se publica en /wp-login.php(sin ninguna variable GET en la URL) y mirando la fuente no hay ni siquiera un nombre de entrada action, por lo que incluso $_REQUEST['action']está vacío.
Mike
10

Prueba esto en las funciones de tu tema.php

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();
 }
}
Androliyah
fuente
trabajando para mí, pero tengo problemas para cerrar sesión y no puedo entender por qué
Androliyah
77
Porque wp-login.php también maneja el cierre de sesión.
Brian Fegter
Sí, esto bloquea mi formulario de inicio de sesión personalizado. ¿Pero si hubiera una manera de verificar de manera confiable la solicitud var o quizás el referente? IOW: este podría ser un punto de partida. ¿Alguien mas? TIA --- JC
jchwebdev
Ah sí, wp-login maneja el cierre de sesión. Jajaja Eso es lógico. Quizás este código con un complemento sea suficiente. Déjame ver qué más podemos usar porque odio usar wp-login.
Androliyah
Todo lo que creo que es necesario sería monitorear los vars de solicitud cuando se carga wp-login. Simplemente no tengo una máquina que pueda hacer eso ahora.
jchwebdev
3

Agregue un GET var para la acción de cierre de sesión y funciona bien.

add_action('init','custom_login');

function custom_login(){
 global $pagenow;
 if( 'wp-login.php' == $pagenow && $_GET['action']!="logout") {
  wp_redirect('http://YOURSITE.com/');
  exit();
 }
}
decano
fuente
Hasta ahora, esto es lo más cercano a lo que queremos. Si eliminamos la salida () y cambiamos wp_redirect a nuestra página de inicio de sesión personalizada, parece que funciona.
jchwebdev
3

He estado usando el complemento de WordPress Rename wp-login.php durante bastante tiempo.

Te permite cambiar wp-login.phpa cualquier otra ruta. Estaba haciendo que los bots cerraran mis páginas de inicio de sesión, y ahora recibo cero visitas.

gdaniel
fuente
1

WP-login maneja inicio de sesión, cierre de sesión, registro, restablecimiento de contraseña y recuperación. Suponiendo que desea cambiar la página de inicio de sesión front-end. Puede usar con seguridad el siguiente código:

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

Este fragmento de código:

  1. Redirige a todos los visitantes del sitio web a una nueva página de inicio de sesión.
  2. Cerrar sesión funcionará sin ningún problema
  3. En su página de inicio de sesión personalizada, deberá crear formularios personalizados de inicio de sesión, registro y restablecimiento de contraseña. Sin embargo, sus formularios personalizados pueden publicar datos de forma segura en wp-login.php ya que las solicitudes de publicación no se redirigen.
Fiaz Husyn
fuente
1
home_url()ya agrega una barra diagonal, así que no hay necesidad de eso. También $pagenowes (a) un global que solo está presente en el administrador (y tal vez el inicio de sesión) y (b) deben reemplazarse con get_current_screen()verificaciones de propiedad.
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);
}

Esto redirigirá a / login en lugar del desagradable formulario wp-login.

corysimmons
fuente
hmmm idea interesante, pero explique cómo / por qué funciona
Mark Kaplun
Esto no funcionará. Esto filtra las solicitudes de la URL de inicio de sesión a través de login_url (), no impide que alguien escriba manualmente wp-login.php.
Matt
0

Si su intención es protegerse wp-login.phpde que los extraños incluso puedan verlo, la forma más simple y eficiente de hacerlo es solicitar autorización (autenticación básica) para acceder wp-login.php.

En Apache, la autenticación se implementa mediante una combinación de htaccess y un archivo de contraseña . La primera vez, dentro de una sesión del navegador, que alguien intente acceder, wp-login.phpse le pedirá que ingrese un nombre de usuario y una contraseña (antes del inicio de sesión de WordPress).

Para simplificar las cosas, este nombre de usuario y contraseña pueden ser los mismos para todas las personas a las que desea dar acceso wp-login.php, ya que aún tienen que ingresar su inicio de sesión de WordPress después de pasar con éxito el primer cuadro de diálogo de autenticación.

Gaia
fuente
Interesante. Supongo que el 'aviso' es la ventana emergente modal del navegador para ingresar credenciales. Creo que eso causaría confusión. Idealmente, lo que quiero es que esa URL no haga nada ... o tal vez simplemente redirija a la página de inicio. Pero gracias por eso. ¡Aprenda algo nuevo cada día!
jchwebdev
Lo que piensas que estás haciendo es "seguridad a través de la oscuridad". Pero en realidad solo estás haciendo oscuridad, y eso es terrible. No lo uses. La autenticación es seguridad. Ocultar el punto de entrada es la oscuridad. security.stackexchange.com/questions/32064/…
Gaia
1
En otras palabras, incluso si cambia la ubicación de wp-login, aún necesita usar auth: "¿Debo confiar en cambiar el servidor del 22 al puerto 2222 para mantener mi conexión segura? Absolutamente no. ¿Es malo cambiar mi Servidor SSH al puerto 2222 mientras usa también una contraseña No, si es que esta es la mejor solución. Cambiar ("ocultar") el puerto simplemente reducirá un montón de escáneres de exploits automáticos que buscan puertos normales. Obtenemos una ventaja de seguridad a través de oscuridad, lo cual es bueno, pero no contamos con la oscuridad. Si la encuentran, aún necesitan descifrar la contraseña ".
Gaia
Gracias por eso. Aprendí mucho. No es lo que estaba buscando, pero aún así ... muy útil. Mejor --- JC
jchwebdev
0

Reemplace $pageidcon la página a la que desea que los usuarios sean redirigidos

/* 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' );
Mohamed Omar
fuente
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 } ?>

Ejemplo de mi página de inicio de sesión personalizada. Guardar login.php y poner código

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

en functions.php

Rei
fuente
¿Podría editar su pregunta y explicar por qué esta respuesta es mejor que las respuestas anteriores o qué está haciendo exactamente lo que está haciendo? Las respuestas de solo código generalmente están mal vistas sin algún tipo de explicación.
Howdy_McGee
este código cambia wp-login.php a login.php con mi código personalizado basado en bootstrap. Puede prevenir el bot automático o adivinar la URL predeterminada. el uso puede cambiar <i> inicio de sesión </i> para expresar lo que desea. y nadie sabe directamente la URL de inicio de sesión le extrae.
Rei