Desativar ou redirecionar WP-login.php


10

Existe uma maneira de impedir que os visitantes, logados ou não, cheguem mysite.com/wp-login.php?

Eu tenho um formulário de login separado, que é tudo o que precisamos. Eu sei que posso mudar o estilo do formulário gerado por, wp-loginmas prefiro não precisar lidar com isso. Eu tentei vários filtros e ganchos e não consigo redirecioná-lo. Também tentei usar um .htaccessredirecionamento e descobri que isso funciona, mas impede que meu formulário de logon / logout personalizado funcione.

Ideias?


você está fazendo isso por razões de segurança? por que não implementar auth apenas para wp-login.php?
— Gaia

Eu não sei o que você quer dizer com isso. Por favor, expanda um pouco. TIA.
— Jchwebdev

POR QUE você precisa de um formulário de login separado? por razões de segurança?
— Gaia

Descobrimos que muitas pessoas hoje em dia conhecem o 'wp-login'. Preferimos que isso não seja tão óbvio. Você pode me dizer o que significa 'por que não implementar autenticação'? TIA
— jchwebdev

veja a resposta fornecida.
— Gaia

Respostas:


18

Depois de encontrar essa pergunta e testar algumas das respostas, a seguir está uma versão "limpa" do que estou usando em um ambiente de produção.

Esta versão não lança nenhum aviso / erro e também permite que as redefinições de senha funcionem:

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

Isso parece impedir o WP-Login (bom), mas a saída final () parece impedir que o login real () ocorra, o que não é o que queremos. Queremos que as pessoas possam fazer login, mas nunca veja a tela de login do WP. Se eles digitarem um PW incorreto, ele será redirecionado para a nossa página de login personalizada.
— 21134 jjwebdev

Editado e ele está trabalhando agora: você tem que verificar se $ ação é preenchido antes de fazer in_array ()
— simonthesorcerer

Isso não funcionou para mim. Eu ainda podia fazer login.
— Mike

@ Mike - Tem certeza de que seu gancho está pegando / funcionando? O que acontece se você colocar echo "HERE";dentro da função? Isso ecoa?
— random_user_name

11
@cale_b Sim, o gancho está funcionando bem. O problema é que $_GET['action']está vazio para mim. O formulário é postado em /wp-login.php(sem nenhuma variável GET na URL) e, olhando para a fonte, não há nem um put chamado action, então $_REQUEST['action']está vazio.
— Mike

10

Tente isso nas funções do seu 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();
 }
}

trabalhando para mim, mas estou tendo log out problemas e figura não consigo descobrir por que
— Androliyah

7
Porque o wp-login.php também lida com o logout.
— precisa saber é o seguinte

Sim, isso bloqueia meu formulário de login personalizado. Mas se houvesse uma maneira de verificar com segurança a var requisição ou talvez o referenciador? IOW: este pode ser um ponto de partida. Alguém mais? TIA --- JC
— jchwebdev

Ah, sim, o wp-login lida com o logout. Ri muito. Isso é lógico. Talvez este código com um plugin seja suficiente. Deixe-me ver o que mais podemos usar, porque eu odeio usar o wp-login.
— Androliyah 24/08/12

Tudo o que acho necessário é monitorar os vars de solicitação quando o wp-login é carregado. Só não tenho uma máquina que possa fazer isso agora.
— precisa saber é o seguinte

3

Adicione uma var GET para a ação de logout e ela funcionará bem.

add_action('init','custom_login');

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

Até agora, este é o mais próximo do que queremos. Se removermos a saída () e mudarmos o wp_redirect para a nossa página de login personalizada, ele parece fazer o trabalho.
— 21134 jjwebdev

3

Estou usando o plug - in do WordPress Renomear wp-login.php há algum tempo.

Permite alternar wp-login.phppara qualquer outro caminho. Eu estava tendo bots batendo minhas páginas de login e agora recebo zero acertos.


1

O WP-login lida com login, logout, registro, redefinição e recuperação de senha. Supondo que você queira alterar a página de login do front-end. Você pode usar com segurança o seguinte 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 trecho de código:

  1. Redirecione todos os visitantes do site para a nova página de login.
  2. O logout funcionará sem problemas
  3. Na sua página de login personalizada, você terá que criar formulários personalizados de login, registro e redefinição de senha. No entanto, seus formulários personalizados podem postar dados com segurança no wp-login.php, pois as solicitações de postagem não são redirecionadas.

11
home_url()já adiciona uma barra principal, portanto não há necessidade disso. Também $pagenowé (a) um global que está presente apenas em admin (e talvez no logon) e (b) deve ser substituído por get_current_screen()verificações de propriedade.
— 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);
}

Isso irá redirecionar para / login em vez do formulário desagradável de wp-login.


hmmm idéia interessante, mas por favor, explicar como / por que ela funciona
— Mark Kaplun

Isso não vai funcionar. Isso filtra solicitações para o URL de login via login_url (), não impede que alguém digite manualmente wp-login.php.
— Matt

0

Se sua intenção é proteger wp-login.phpcontra estranhos, mesmo que seja capaz de vê-lo, a maneira mais simples e eficiente de fazer isso é exigir autorização (autenticação básica) para acessar wp-login.php.

No Apache, a autenticação é implementada através de uma combinação de htaccess e um arquivo de senha . Na primeira vez, em uma sessão do navegador, que alguém tentar acessar wp-login.php, será solicitado que você digite um nome de usuário e senha (antes do login no wordpress).

Para simplificar, esse nome de usuário e senha podem ser os mesmos para todas as pessoas às quais você deseja acessar wp-login.php, pois elas ainda precisam inserir seu login no wordpress após passarem pela primeira caixa de diálogo de autenticação.


Interessante. Estou assumindo que o 'prompt' é o pop-up modal do navegador para inserir credenciais. Eu acho que isso causaria confusão. Idealmente, o que eu quero é que esse URL faça -nothing -... ou talvez apenas redirecione para a página inicial. Mas obrigado por isso. Aprenda algo novo todos os dias!
— Jchwebdev

O que você pensa que está fazendo é "segurança através da obscuridade". Mas, na realidade, você está apenas obscurecendo, e isso é terrível. Não use isso. Auth é segurança. Ocultar o ponto de entrada é obscuridade. security.stackexchange.com/questions/32064/…
— Gaia

11
Em outras palavras, mesmo se você alterar o local do wp-login, ainda precisará usar o auth: "Devo confiar na alteração do servidor de 22 para a porta 2222 para manter minha conexão segura? Absolutamente não. É ruim alterar meu Servidor SSH para a porta 2222 enquanto também usa uma senha? Não, se essa for a melhor solução. Alterar ("Obscurecer") a porta simplesmente reduzirá um monte de scanners de exploração automática que pesquisam portas normais. obscuridade o que é bom, mas não estamos contando com a obscuridade. Se a encontraram, ainda precisam quebrar a senha. "
— Gaia

Obrigado por isso. Eu aprendi muito. Não é o que eu estava procurando, mas ainda assim ... muito útil. Melhor --- JC
— jchwebdev 31/05

0

Substitua $pageidpela página para a qual você deseja que os usuários sejam redirecionados

/* 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 } ?>

Exemplo da minha página de login personalizada. Salvando login.php e colocar 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();
 }
}

no functions.php


Você poderia editar sua pergunta e explicar por que essa resposta é melhor do que as respostas anteriores ou o que exatamente você está fazendo? As respostas somente em código geralmente são desaprovadas, sem algum tipo de explicação.
— Howdy_McGee

esse código alterna wp-login.php para login.php com meu código personalizado com base no bootstrap Ele pode impedir o bot automático ou adivinhar o URL padrão. o uso pode mudar <i> login </i> para expressar o que você deseja. e ninguém sabe que o URL de login diretamente o excede.
— Rei
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.