Вимкнути або перенаправити WP-login.php


10

Чи є спосіб запобігти відвідувачам, незалежно від того, увійшли чи не ввійшли mysite.com/wp-login.php?

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

Ідеї?


ви це робите з міркувань безпеки? чому б не реалізувати auth лише для wp-login.php?
Гая

Я не знаю, що ти маєш на увазі під цим. Будь ласка, розгорніть трохи. ТІА.
jchwebdev

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

Ми виявляємо, що занадто багато людей сьогодні знають про «wp-логін». Ми вважаємо за краще не бути таким очевидним. Чи можете ви просто сказати мені, що означає "чому не реалізувати auth"? 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 (добре), але остаточний вихід (), здається, запобігає виникненню фактичного входу (), що не є тим, чого ми хочемо. Ми хочемо, щоб люди могли увійти, просто ніколи не побачивши екран WP-входу. Якщо вони вводять неправильно 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

Спробуйте це в function.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

4

Додайте GET var для дії виходу, і це прекрасно працює.

add_action('init','custom_login');

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

Поки що це найближче до того, що ми хочемо. Якщо ми видалимо вихід () і змінимо wp_redirect на нашу власну сторінку входу, вона, схоже, виконає цю роботу.
jchwebdev

3

Я використовую плагін WordPress Перейменувати wp-login.php досить давно.

Це дозволяє вам перейти wp-login.phpна будь-який інший шлях. У мене боти ляскали мої сторінки входу, і тепер я отримую нульові звернення.


1

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

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(a) глобальний, який присутній лише в адміністраторі (і, можливо, логін) та (b), слід замінити на 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, auth реалізується за допомогою комбінації htaccess та файла пароля . Перший раз, коли під час сеансу роботи в браузері хтось намагається отримати доступ, wp-login.phpїм буде запропоновано ввести ім’я користувача та пароль (перед входом у Wordpress).

Для спрощення речей це ім’я користувача та пароль можуть бути однаковими для кожної людини, до якої ви хочете надати доступ wp-login.php, оскільки вони все ще повинні ввести свою реєстраційну систему Wordpress після успішного проходження першого діалогового вікна Auth.


Цікаво. Я припускаю, що "підказка" - це модальне спливаюче вікно браузера для введення облікових даних. Я думаю, що це призведе до плутанини. В ідеалі, я хочу, щоб ця URL-адреса робила -ніщо -... або, можливо, просто перенаправляла на головну сторінку. Але дякую за це. Щодня дізнайтеся щось нове!
jchwebdev

Що ви думаєте, що робите, це "безпека через невідомість". Але насправді ти робиш лише незрозумілість, і це жахливо. Не використовуйте. Автентичність - це безпека. Приховувати точку входу - невідомість. security.stackexchange.com/questions/32064/…
Gaia

1
Іншими словами, навіть якщо ви зміните місце розташування wp-login, вам все одно потрібно використовувати auth: "Чи слід покладатися на зміну сервера з 22 на порт 2222, щоб зберегти моє з'єднання? Абсолютно ні. Чи погано змінити мій SSH-сервер для порту 2222, а також використовує пароль? Ні, якщо що-небудь це найкраще рішення. Змінивши ("Затемнення") порт буде просто скорочено на купі автоматичних сканерів, що експлуатуються, шукаючи звичайні порти. Ми отримуємо перевагу безпеки через незрозумілість, що добре, але ми не розраховуємо на неясність. Якщо вони знайшли це, їм все одно потрібно зламати пароль ".
Гая

Дякую за це. Я багато чому навчився. Не те, що я шукав, але все-таки ... дуже корисно. Найкращий --- 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>, щоб викласти те, що ви хочете.
Рей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.