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?

jchwebdev
fonte
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();
    }
}
random_user_name
fonte
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();
 }
}
Androliyah
fonte
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();
 }
}
reitor
fonte
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.

gdaniel
fonte
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.
Fiaz Husyn
fonte
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.

corysimmons
fonte
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.

Gaia
fonte
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' );
Mohamed Omar
fonte
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

Rei
fonte
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