Wyłącz lub przekieruj WP-login.php


10

Czy istnieje sposób, aby uniemożliwić odwiedzającym, zalogowanym lub nie, dotarcie do mysite.com/wp-login.php?

Mam osobny formularz logowania, który jest wszystkim, czego potrzebujemy. Wiem, że mogę zmienić styl wygenerowanego formularza, wp-loginale wolałbym w ogóle z nim nie radzić. Próbowałem różnych filtrów i haczyków i wydaje mi się, że nie mogę przekierować. Próbowałem również użyć .htaccessprzekierowania i okazało się, że to działa, ale wtedy uniemożliwia działanie mojego niestandardowego formularza logowania / wylogowania.

Pomysły?


robisz to ze względów bezpieczeństwa? dlaczego nie zaimplementować auth tylko dla wp-login.php?
Gaia,

Nie wiem o co ci chodzi. Rozwiń trochę. TIA
jchwebdev

DLACZEGO potrzebujesz osobnego formularza logowania? ze względów bezpieczeństwa?
Gaia

Okazuje się, że obecnie zbyt wiele osób zdaje sobie sprawę z „wp-login”. Wolelibyśmy, żeby to nie było tak oczywiste. Czy możesz mi tylko powiedzieć, co znaczy „dlaczego nie zaimplementować uwierzytelniania”? TIA
jchwebdev

patrz udzielona odpowiedź.
Gaia

Odpowiedzi:


19

Po znalezieniu tego pytania i przetestowaniu kilku odpowiedzi poniżej znajduje się „oczyszczona” wersja tego, czego używam w środowisku produkcyjnym.

Ta wersja nie generuje żadnych powiadomień / błędów, a także umożliwia resetowanie hasła do działania:

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

Wydaje się, że to uniemożliwia WP-Login (dobre), ale wydaje się, że końcowe wyjście () uniemożliwia rzeczywiste logowanie (), co nie jest tym, czego chcemy. Chcemy, aby ludzie mogli się zalogować, po prostu nigdy nie wyświetlaj ekranu WP-Login. Jeśli wprowadzą niepoprawny PW, powinien przekierować na naszą niestandardową stronę logowania.
jchwebdev

Edytowane i to on teraz działa: trzeba sprawdzić, czy $ akcja jest wypełniona przed wykonaniem in_array ()
simonthesorcerer

To nie działało dla mnie. Nadal mogłem się zalogować.
Mike

@Mike - Czy jesteś pewien, że twój haczyk bierze / działa? Co się stanie, jeśli wstawisz echo "HERE";funkcję? Czy to echo?
random_user_name

1
@cale_b Tak, hak działa dobrze. Problem w tym, że $_GET['action']jest dla mnie pusty. Formularz jest wysyłany do /wp-login.php(bez żadnych zmiennych GET w adresie URL) i patrząc na źródło, w którym nie ma nawet nazwanego zestawu action, więc nawet $_REQUEST['action']jest pusty.
Mike

10

Wypróbuj to w pliku functions.php swojego motywu

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

pracuje dla mnie, ale mam problemy z wylogowaniem i nie mogę się dowiedzieć, dlaczego
Androliyah,

7
Ponieważ wp-login.php obsługuje również wylogowanie.
Brian Fegter

Tak, to blokuje mój niestandardowy formularz logowania. Ale czy istnieje sposób, aby rzetelnie sprawdzić zmienną żądania lub referencję? IOW: może to być punkt wyjścia. Ktoś jeszcze? TIA --- JC
jchwebdev

Ach tak, wp-login obsługuje wylogowanie. Lol. To logiczne. Być może wystarczy ten kod z wtyczką. Zobaczę, czego jeszcze możemy użyć, bo nienawidzę używać wp-login.
Androliyah

Wszystko, co uważam za konieczne, to monitorowanie zmiennych żądania po załadowaniu wp-login. Po prostu nie mam maszyny, która mogłaby to teraz zrobić.
jchwebdev

4

Dodaj zmienną GET dla akcji wylogowania i działa dobrze.

add_action('init','custom_login');

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

Jak dotąd jest to najbliższe temu, czego chcemy. Jeśli usuniemy exit () i zmienimy wp_redirect na naszą niestandardową stronę logowania, wygląda na to, że wykona zadanie.
jchwebdev

3

Używam wtyczki WordPress Zmień nazwę wp-login.php od dłuższego czasu.

Pozwala przełączyć się wp-login.phpna dowolną inną ścieżkę. Boty zatrzaskiwały moje strony logowania i teraz otrzymuję zero trafień.


1

WP-login obsługuje logowanie, wylogowanie, rejestrację, resetowanie i odzyskiwanie hasła. Zakładając, że chcesz zmienić stronę logowania frontonu. Możesz bezpiecznie użyć następującego kodu:

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

Ten fragment kodu:

  1. Przekieruj wszystkich odwiedzających stronę na nową stronę logowania.
  2. Wylogowanie będzie działać bez problemu
  3. Na stronie niestandardowego logowania musisz utworzyć niestandardowe formularze logowania, rejestracji i resetowania hasła, jednak formularze niestandardowe mogą bezpiecznie wysyłać dane do wp-login.php, ponieważ żądania wysyłania nie są przekierowywane.

1
home_url()już dodaje wiodący ukośnik, więc nie ma takiej potrzeby. $pagenowJest także (a) globalny, który jest obecny tylko w adminie (i może login) i (b) należy zastąpić get_current_screen()sprawdzaniem właściwości.
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);
}

Spowoduje to przekierowanie do / login zamiast nieprzyjemnego formularza wp-login.


hmmm ciekawy pomysł, ale proszę wyjaśnić, jak / dlaczego to działa
Mark Kaplun

To nie zadziała. To filtruje żądania adresu URL logowania przez login_url (), nie uniemożliwia to ręcznego wpisania wp-login.php.
Matt

0

Jeśli Twoim celem jest ochrona wp-login.phpprzed nieznajomymi, a nawet możliwość zobaczenia, najprostszym skutecznym sposobem jest wymaganie autoryzacji (podstawowego uwierzytelnienia) w celu uzyskania dostępu wp-login.php.

W Apache uwierzytelnianie odbywa się za pomocą połączenia htaccess i pliku hasła . Po raz pierwszy, w sesji przeglądarki, ktokolwiek spróbuje uzyskać dostęp wp-login.php, zostanie poproszony o podanie nazwy użytkownika i hasła (przed zalogowaniem się do wordpress).

Aby uprościć sprawę, ta nazwa użytkownika i hasło mogą być takie same dla każdej osoby, do której chcesz uzyskać dostęp wp-login.php, ponieważ nadal muszą one wprowadzić login wordpress po pomyślnym przejściu przez pierwsze okno dialogowe uwierzytelniania.


Ciekawy. Zakładam, że „monit” jest modalnym wyskakującym okienkiem przeglądarki do wprowadzania poświadczeń. Myślę, że to spowodowałoby zamieszanie. Idealnie chcę, aby ten adres URL działał „nic”… a może po prostu przekierowywał na stronę główną. Ale dzięki za to. Naucz się czegoś nowego każdego dnia!
jchwebdev

To, co według ciebie robisz, to „bezpieczeństwo przez zaciemnienie”. Ale w rzeczywistości robisz tylko niejasności, a to jest okropne. Nie używaj tego. Auth to bezpieczeństwo. Ukrywanie punktu wejścia jest niejasne. security.stackexchange.com/questions/32064/…
Gaia

1
Innymi słowy, nawet JEŚLI zmienisz lokalizację wp-login, nadal musisz użyć auth: „Czy powinienem polegać na zmianie serwera z 22 na port 2222, aby zapewnić bezpieczeństwo mojego połączenia? Absolutnie nie. Czy zmiana mojego Serwer SSH do portu 2222 przy użyciu hasła? Nie, jeśli cokolwiek to jest najlepsze rozwiązanie. Zmiana („zasłanianie”) portu po prostu zmniejszy liczbę stosów automatycznych skanerów exploitów przeszukujących normalne porty. niejasność, co jest dobre, ale nie liczymy na niejasność. Jeśli ją znaleźli, nadal muszą złamać hasło. ”
Gaia

Dziękuję za to. Dużo się nauczyłem. Nie tego szukałem, ale nadal ... bardzo pomocny. Najlepszy --- JC
jchwebdev

0

Zastąp $pageidstronę, na którą mają zostać przekierowani użytkownicy

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

Przykład mojej niestandardowej strony logowania. Zapisywanie login.php i wprowadzenie kodu

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

w functions.php


Czy możesz edytować swoje pytanie i wyjaśnić, dlaczego ta odpowiedź jest lepsza niż poprzednie odpowiedzi lub co dokładnie robisz, co robisz. Odpowiedzi tylko na kod są zwykle marszczone bez jakiegoś wyjaśnienia.
Howdy_McGee

ten kod przełącza wp-login.php na login.php z moim niestandardowym kodem opartym na bootstrap Może to zapobiec automatycznemu botowi lub odgadnąć domyślny adres URL. użyj może zmienić <i> login </i>, aby frazować, co chcesz. i nikt nie wie, bezpośredni adres URL excerp ciebie.
Rei,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.