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

24 авг. 2012 г., 05:05:31
Просмотры: 93.9K
Голосов: 14

Есть ли способ предотвратить доступ посетителей (авторизованных или нет) к странице mysite.com/wp-login.php?

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

Какие есть идеи?

6
Комментарии

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

Gaia Gaia
20 мая 2013 г. 21:13:58

Я не понимаю, что вы имеете в виду. Пожалуйста, поясните подробнее. Заранее спасибо.

jchwebdev jchwebdev
21 мая 2013 г. 21:38:00

ЗАЧЕМ вам нужна отдельная форма входа? Из соображений безопасности?

Gaia Gaia
22 мая 2013 г. 04:05:44

Мы заметили, что в наши дни слишком много людей знают о 'wp-login'. Нам бы хотелось, чтобы это не было так очевидно.

Не могли бы вы просто объяснить, что означает "почему бы не реализовать auth"? Заранее спасибо.

jchwebdev jchwebdev
22 мая 2013 г. 23:09:35

см. предоставленный ответ.

Gaia Gaia
23 мая 2013 г. 00:47:14

если вы нашли решение, отметьте правильный ответ как принятый.

Gaia Gaia
23 мая 2013 г. 22:31:08
Показать остальные 1 комментариев
Все ответы на вопрос 9
11
27

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

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

// Подключаем соответствующий экшен WordPress
add_action('init', 'prevent_wp_login');

function prevent_wp_login() {
    // WP отслеживает текущую страницу - глобализируем переменную для доступа
    global $pagenow;
    // Проверяем, установлен ли $_GET['action'], и если да, загружаем в переменную $action
    $action = (isset($_GET['action'])) ? $_GET['action'] : '';
    // Проверяем, находимся ли мы на странице входа, и убеждаемся, что действие не 'logout'
    if( $pagenow == 'wp-login.php' && ( ! $action || ( $action && ! in_array($action, array('logout', 'lostpassword', 'rp', 'resetpass'))))) {
        // Загружаем URL главной страницы
        $page = get_bloginfo('url');
        // Перенаправляем на главную страницу
        wp_redirect($page);
        // Останавливаем выполнение, чтобы предотвратить загрузку страницы по любой причине
        exit();
    }
}
4 июл. 2014 г. 00:45:24
Комментарии

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

jchwebdev jchwebdev
15 июл. 2014 г. 21:52:35

Отредактировал, и теперь это работает: нужно проверять, заполнен ли $action, перед выполнением in_array().

simonthesorcerer simonthesorcerer
22 июл. 2014 г. 00:45:07

У меня это не сработало. Я все еще мог войти в систему.

Mike Mike
3 окт. 2015 г. 06:43:13

@Mike - Ты уверен, что твой хук срабатывает/работает? Что будет, если добавить echo "HERE"; внутри функции? Выводится ли это сообщение?

random_user_name random_user_name
3 окт. 2015 г. 17:41:07

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

Mike Mike
4 окт. 2015 г. 01:24:50

@cale_b Похоже, что приведенный выше код выполняется после того, как вход уже произошел. Если я добавлю exit; (перед wp_redirect) и обновлю страницу, я не получаю предупреждения о повторной отправке POST-переменных на сервер, что означает, что сервер уже выполнил перенаправление. И если я обновлю страницу после этого, я оказываюсь авторизованным.

Mike Mike
4 окт. 2015 г. 02:14:50

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

random_user_name random_user_name
4 окт. 2015 г. 17:55:31

Протестировано и работает!

Dale Clifford Dale Clifford
24 мар. 2018 г. 10:55:44

Я новичок в php и WordPress. Мой вопрос: куда в вашем коде мне нужно вставить ссылку на мою собственную страницу входа/профиля?

Aousaf Rashid Aousaf Rashid
17 янв. 2019 г. 18:40:50

Это просто мешает любому пользователю войти в систему при использовании wp_login_form на пользовательской странице. Вход никогда не будет разрешен, независимо от того, введены правильные учетные данные или нет.

Nathan Nathan
21 мая 2019 г. 20:18:09

Просто ОГРОМНОЕ спасибо. Я сам весь день возился с этим.

Juergen Schulze Juergen Schulze
3 июн. 2020 г. 17:10:48
Показать остальные 6 комментариев
6
11

Попробуйте добавить этот код в файл 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();
 }
}
24 авг. 2012 г. 06:06:45
Комментарии

у меня работает, но есть проблемы с выходом из системы, и я не могу понять, почему

Androliyah Androliyah
24 авг. 2012 г. 06:26:09

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

Brian Fegter Brian Fegter
24 авг. 2012 г. 07:02:30

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

jchwebdev jchwebdev
24 авг. 2012 г. 10:15:28

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

Androliyah Androliyah
24 авг. 2012 г. 22:12:30

Я думаю, всё, что нужно — это мониторить переменные запроса при загрузке wp-login. Просто у меня сейчас нет машины, которая может это сделать.

jchwebdev jchwebdev
25 авг. 2012 г. 03:34:09

Я использую плагин Buddypress, который перенаправляет с wp-login на кастомную страницу входа. Возможно, тебе стоит посмотреть код, чтобы понять, как это реализовано. Плагин называется Branded Login for Buddypress, разработан Brajesh Singh на (buddydev.com)

Androliyah Androliyah
25 авг. 2012 г. 16:43:40
Показать остальные 1 комментариев
1

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

add_action('init','custom_login');

function custom_login(){
 global $pagenow;
 if( 'wp-login.php' == $pagenow && $_GET['action']!="logout") {
  wp_redirect('http://ВАШСАЙТ.com/');
  exit();
 }
}
20 апр. 2014 г. 23:20:46
Комментарии

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

jchwebdev jchwebdev
15 июл. 2014 г. 22:11:32
0

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

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

4 июл. 2014 г. 00:53:16
2

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

function custom_login_page() {
 $new_login_page_url = home_url( '/login/' ); // новая страница входа
 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, так как POST-запросы не перенаправляются.
29 окт. 2014 г. 14:17:18
Комментарии

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

kaiser kaiser
29 окт. 2014 г. 14:41:31

Это работает лучше всего. Спасибо

ItsJhonny ItsJhonny
8 мар. 2022 г. 13:37:05
2
// https://codex.wordpress.org/Plugin_API/Filter_Reference/login_url#Examples
add_filter('login_url', 'custom_login_url', 10, 3);

/**
 * Изменяет стандартный URL страницы входа в WordPress
 * 
 * @param string $login_url    Исходный URL входа
 * @param string $redirect     URL для перенаправления после входа
 * @param bool   $force_reauth Нужна ли принудительная повторная аутентификация
 * @return string Новый URL страницы входа
 */
function custom_login_url($login_url, $redirect, $force_reauth) {
    return home_url('/login/?redirect_to=' . $redirect);
}

Этот код перенаправляет пользователей на страницу /login вместо стандартной формы wp-login.

11 янв. 2017 г. 17:12:13
Комментарии

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

Mark Kaplun Mark Kaplun
11 янв. 2017 г. 17:25:28

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

Matt Matt
4 июл. 2019 г. 21:41:21
4

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

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

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

23 мая 2013 г. 00:46:59
Комментарии

Интересно. Полагаю, 'prompt' — это модальное окно браузера для ввода учетных данных. Думаю, это может вызвать путаницу. В идеале я хочу, чтобы этот URL не делал ничего... или, возможно, просто перенаправлял на главную страницу. Но спасибо за информацию. Каждый день узнаю что-то новое!

jchwebdev jchwebdev
27 мая 2013 г. 05:57:14

То, что вы делаете, называется "безопасность через скрытность". Но на самом деле вы просто скрываете, и это ужасная практика. Не используйте её. Аутентификация — это безопасность. Скрытие точки входа — это просто скрытность. http://security.stackexchange.com/questions/32064/at-what-point-does-something-count-as-security-through-obscurity

Gaia Gaia
27 мая 2013 г. 14:50:01

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

Gaia Gaia
27 мая 2013 г. 15:41:56

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

jchwebdev jchwebdev
31 мая 2013 г. 06:51:22
0

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

/* Перенаправление страницы входа */
function redirect_login_page(){
  // Сохраняем для проверки, равна ли эта страница wp-login.php
   $page_viewed = basename( $_SERVER['REQUEST_URI'] );

  // Постоянная ссылка на кастомную страницу входа
  $login_page  = get_permalink($pageid);

  if( $page_viewed == "wp-login.php" ) {
    wp_redirect( $login_page );
    exit();
  }
}

add_action( 'init','redirect_login_page' );
6 янв. 2017 г. 10:36:49
3
<?php
/* Шаблон: Регистрация */
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">
    Вы вошли как <a href="<?php echo $profile_url ?>"><?php echo $current_user->display_name; ?></a> Хотите <a href="<?php echo esc_url(wp_logout_url($current_url)); ?>">выйти</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 = 'Пожалуйста, заполните все поля';
        } else if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $err = 'Некорректный email';
        } else if(email_exists($email) ) {
            $err = 'Email уже существует';
        } else if($pwd1 <> $pwd2 ){
            $err = 'Пароли не совпадают';
        } 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 = 'Ошибка при создании пользователя.';
            } else {
                do_action('user_register', $user_id);
                $success = 'Регистрация прошла успешно';
            }
        }
    }
    ?>
  <link  rel="stylesheet" type="text/css"  href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<!--сообщения об ошибках/успехе-->
<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.'> Войти</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">Логин:</label>
    <div class="col-sm-9">
    <input type="text" class="form-control" name="username" id="username" placeholder="Логин">
    </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">Пароль</label>
    <div class="col-sm-9">
        <input type="password" class="form-control" name="pwd1" id="pwd1" placeholder="Введите пароль">
    </div>
</div>
<div class="form-group">
    <label class="control-label col-sm-3" for="pwd2">Повторите пароль:</label>
    <div class="col-sm-9">
        <input type="password" class="form-control" name="pwd2" id="pwd2" placeholder="Повторите пароль">
    </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">Зарегистрироваться</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>Ошибка</strong> Неверный логин или пароль!';
        } elseif ( $login === "empty" ) {
                echo '<strong>Ошибка:</strong>Логин или пароль не могут быть пустыми.';
        } elseif ( $login === "false" ) {
                echo '<strong>ОШИБКА:</strong> Выход';
        }
    ?>
</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

18 авг. 2017 г. 05:25:31
Комментарии

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

Howdy_McGee Howdy_McGee
18 авг. 2017 г. 07:07:19

Этот код заменяет wp-login.php на login.php с моим пользовательским кодом на основе Bootstrap. Это может предотвратить автоматические боты или угадывание стандартного URL. Вы можете изменить <i>login</i> на любое слово, которое захотите, и никто не будет знать прямой URL для входа, кроме вас.

Rei Rei
20 авг. 2017 г. 11:30:39

add_action('check_admin_referer', 'logout_without_confirm', 10, 2); function logout_without_confirm($action, $result) { /* * Разрешает выход без подтверждения / if ($action == "log-out" && !isset($_GET['_wpnonce'])) { $redirect_to = isset($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'https://yourdomain.com'; $location = str_replace('&', '&', wp_logout_url($redirect_to)); header("Location: $location"); die; } }

Hercules S. Hercules S.
22 июл. 2023 г. 07:33:41