Отключить или перенаправить WP-login.php


10

Есть ли способ предотвратить доступ посетителей, вошедших в систему или нет mysite.com/wp-login.php?

У меня есть отдельная форма входа в систему, и это все, что нам нужно. Я знаю, что могу изменить стиль сгенерированной формы, wp-loginно я бы предпочел вообще не иметь с ней дело. Я пробовал различные фильтры и хуки, и я не могу заставить его перенаправить. Я также попытался с помощью .htaccessперенаправления, и я обнаружил, что это работает, но затем он препятствует работе моей пользовательской формы входа / выхода.

Идеи?


Вы делаете это по соображениям безопасности? почему бы не реализовать аутентификацию только для wp-login.php?
Гайя

Я не знаю, что вы подразумеваете под этим. Пожалуйста, расширьте немного. ТИА.
jchwebdev

ПОЧЕМУ вам нужна отдельная форма входа? по соображениям безопасности?
Гея

Мы находим, что слишком много людей в наши дни знают о «wp-login». Мы бы не хотели, чтобы это было так очевидно. Можете ли вы просто сказать мне, что означает «почему бы не реализовать аутентификацию»? TIA
jchwebdev

смотри ответ при условии.
Гайя

Ответы:


19

После нахождения этого вопроса и проверки нескольких ответов ниже приведена «исправленная» версия того, что я использую в производственной среде.

Эта версия не генерирует никаких уведомлений / ошибок, а также позволяет сбрасывать пароль для работы:

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

Похоже, что это предотвращает WP-Login (хорошо), но заключительный exit (), по-видимому, предотвращает фактическое login () вообще, что не то, что мы хотим. Мы хотим, чтобы люди могли войти в систему, просто никогда не видеть экран WP-Login. Если они вводят неправильный PW, он должен перенаправить на нашу пользовательскую страницу входа.
jchwebdev

Отредактировал его и теперь он работает: вы должны проверить, заполнен ли $ action, прежде чем делать in_array ()
simonthesorcerer

Это не сработало для меня. Я все еще могу войти.
Майк

@Mike - Вы уверены, что ваш крюк берет / работает? Что произойдет, если вы положите echo "HERE";внутрь функции? Это эхо?
random_user_name

1
@cale_b Да, хук работает нормально. Проблема в том, что $_GET['action']для меня пусто. Форма публикуется /wp-login.php(без каких-либо переменных GET в URL-адресе), и, глядя на источник, нет даже имени с указанием пут action, поэтому даже $_REQUEST['action']он пуст.
Майк

10

Попробуйте это в functions.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

7
Потому что wp-login.php также обрабатывает выход из системы.
Брайан Фегтер

Да, это блокирует мою пользовательскую форму входа. Но был ли способ надежно проверить запрос var или, возможно, реферера? IOW: это может быть отправной точкой. Кто-то еще? TIA --- JC
jchwebdev

Ах да, wp-login обрабатывает выход из системы. Лол. Это логично. Возможно, этого кода с плагином будет достаточно. Позвольте мне посмотреть, что еще мы можем использовать, потому что я ненавижу использовать wp-login.
Андролия

Все, что я считаю необходимым, - это отслеживать изменения запросов при загрузке wp-login. У меня просто нет машины, которая могла бы сделать это прямо сейчас.
jchwebdev

3

Добавьте переменную GET для действия выхода из системы, и она работает нормально.

add_action('init','custom_login');

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

Пока что это самое близкое к тому, что мы хотим. Если мы удалим exit () и изменим wp_redirect на нашу пользовательскую страницу входа в систему, похоже, это сделает работу.
jchwebdev

3

Я уже давно использую плагин WordPress Rename wp-login.php .

Это позволяет вам переключиться wp-login.phpна любой другой путь. У меня были боты, которые хлопали мои страницы входа, и теперь я получаю ноль хитов.


1

WP-login обрабатывает вход в систему, выход из системы, регистрацию, сброс и восстановление пароля. Предполагая, что вы хотите изменить интерфейсную страницу входа. Вы можете смело использовать следующий код:

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

Этот фрагмент кода будет:

  1. Перенаправить всех посетителей сайта на новую страницу входа.
  2. Выход будет работать без проблем
  3. На вашей пользовательской странице входа вам нужно будет создать пользовательские формы входа в систему, регистрации и сброса пароля. Однако ваши пользовательские формы могут безопасно отправлять данные в wp-login.php, так как почтовые запросы не перенаправляются.

1
home_url()уже добавляет ведущую косую черту, так что в этом нет необходимости. Также $pagenow(а) глобальный, который присутствует только на администратора (и, возможно, логин) и (б) следует заменить get_current_screen()проверки свойств.
Кайзер

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

Это перенаправит на / login вместо скверной формы wp-login.


хммм интересная идея, но, пожалуйста, объясните, как / почему это работает
Марк Каплун

Так не пойдет. Это фильтрует запросы на URL для входа в систему через login_url (), это не мешает кому-либо вручную вводить wp-login.php.
Мэтт

0

Если вы намереваетесь защитить wp-login.phpот посторонних лиц, даже не видящих его, самый простой и эффективный способ сделать это - получить доступ (базовую авторизацию) для доступа wp-login.php.

В Apache аутентификация осуществляется через комбинацию htaccess и файла паролей . В первый раз, когда в сеансе браузера кто-то пытается получить доступ, wp-login.phpему будет предложено ввести имя пользователя и пароль (до входа в WordPress).

Чтобы упростить задачу, это имя пользователя и пароль могут быть одинаковыми для всех пользователей, которым вы хотите предоставить доступ wp-login.php, поскольку им все равно придется вводить свой логин WordPress после успешного прохождения первого диалогового окна авторизации.


Интересно. Я предполагаю, что 'prompt' - это модальное всплывающее окно браузера для ввода учетных данных. Я думаю, что это может привести к путанице. В идеале я хочу, чтобы этот URL ничего не делал ... или, возможно, просто перенаправлял на домашнюю страницу. Но спасибо за это. Узнавайте что-то новое каждый день!
jchwebdev

То, что вы думаете, вы делаете, это "безопасность через неизвестность". Но на самом деле вы делаете только мрак, и это ужасно. Не используйте его. Аут это безопасность. Скрывать точку входа - безвестность. security.stackexchange.com/questions/32064/…
Gaia

1
Другими словами, даже если вы измените местоположение wp-login, вам все равно нужно использовать auth: «Стоит ли менять сервер с 22 на порт 2222, чтобы сохранить мое соединение безопасным? Абсолютно нет. SSH-сервер к порту 2222, при этом также используя пароль? Нет, во всяком случае, это лучшее решение. Изменение («скрытие») порта просто сократит кучу автоматических эксплойтов, ищущих нормальные порты. Мы получаем преимущество в безопасности благодаря неясность, которая хороша, но мы не рассчитываем на безвестность. Если они нашли это, им все еще нужно взломать пароль ".
Гея

Спасибо за это. Я многому научился. Не то, что я искал, но все же ... очень полезно. Best --- JC
jchwebdev

0

Замените $pageidна страницу, на которую вы хотите перенаправить пользователей

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

Пример моей пользовательской страницы входа. Сохранение login.php и внесение кода

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

в functions.php


Не могли бы вы отредактировать свой вопрос и объяснить, почему этот ответ лучше предыдущих и что именно вы делаете, что делаете. Ответы только с кодом обычно осуждаются без какого-либо объяснения.
Howdy_McGee

этот код переключает wp-login.php на login.php с моим пользовательским кодом, основанным на начальной загрузке. Он может предотвратить автоматический бот или угадать URL по умолчанию. Использование может изменить <i> логин </ i> на фразу того, что вы хотите. И никто не знает напрямую URL логина, кроме вас.
Рей
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.