Vô hiệu hóa hoặc chuyển hướng WP-login.php


10

Có cách nào để ngăn khách truy cập, cho dù đăng nhập hay không, tiếp cận mysite.com/wp-login.php?

Tôi có một hình thức đăng nhập riêng là tất cả những gì chúng ta cần. Tôi biết tôi có thể tạo kiểu lại biểu mẫu được tạo bởi wp-loginnhưng tôi hoàn toàn không phải đối phó với nó. Tôi đã thử nhiều bộ lọc và móc khác nhau và dường như tôi không thể chuyển hướng nó. Tôi cũng đã thử sử dụng .htaccesschuyển hướng và tôi thấy rằng điều này hoạt động, nhưng sau đó nó ngăn hình thức đăng nhập / đăng xuất tùy chỉnh của tôi hoạt động.

Ý tưởng?


bạn đang làm điều này vì lý do bảo mật? Tại sao không thực hiện auth chỉ cho wp-login.php?
Gaia

Tôi không biết ý của bạn là gì. Hãy mở rộng một chút. TIA.
jchwebdev

TẠI SAO bạn cần một hình thức đăng nhập riêng? Vì lý do bảo mật?
Gaia

Chúng tôi thấy rằng có quá nhiều người ngày nay nhận thức được 'wp-login'. Chúng tôi thà không có điều đó là quá rõ ràng. Bạn có thể chỉ cho tôi biết 'tại sao không thực hiện auth' nghĩa là gì không? TIA
jchwebdev

xem câu trả lời được cung cấp.
Gaia

Câu trả lời:


17

Sau khi tìm thấy câu hỏi này và thử nghiệm một vài câu trả lời, bên dưới là phiên bản "đã dọn sạch" những gì tôi đang sử dụng trong môi trường sản xuất.

Phiên bản này không đưa ra bất kỳ thông báo / lỗi nào và cũng cho phép đặt lại mật khẩu hoạt động:

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

Điều này dường như ngăn chặn Đăng nhập WP (tốt) nhưng lối ra cuối cùng () dường như ngăn việc đăng nhập thực tế () xảy ra ở tất cả những gì không phải là điều chúng ta muốn. Chúng tôi muốn mọi người có thể đăng nhập, chỉ cần không bao giờ thấy màn hình Đăng nhập WP. Nếu họ nhập PW không chính xác, nó sẽ chuyển hướng đến trang đăng nhập tùy chỉnh của chúng tôi.
jchwebdev

Đã chỉnh sửa & nó hiện đang hoạt động: bạn phải kiểm tra xem $ action có được điền không trước khi thực hiện in_array ()
simonthesorcerer

Điều này đã không làm việc cho tôi. Tôi vẫn có thể đăng nhập.
Mike

@Mike - Bạn có chắc cái móc của bạn đang dùng / làm việc không? Điều gì xảy ra nếu bạn đặt echo "HERE";bên trong hàm? Nó có lặp lại không?
Random_user_name 3/10/2015

1
@cale_b Vâng, hook đang hoạt động tốt. Vấn đề là $_GET['action']trống rỗng đối với tôi. Biểu mẫu được đăng lên /wp-login.php(không có bất kỳ biến GET nào trong URL) và nhìn vào nguồn thậm chí không có tên được đặt action, do đó thậm chí còn $_REQUEST['action']trống.
Mike

10

Hãy thử điều này trong chức năng của chủ đề của bạn.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();
 }
}

làm việc cho tôi nhưng tôi có vấn đề đăng xuất & không thể hiểu tại sao
Androliyah

7
Bởi vì wp-login.php cũng xử lý đăng xuất.
Brian Fegter

Vâng, điều này chặn hình thức đăng nhập tùy chỉnh của tôi. Nhưng nếu có một cách đáng tin cậy để kiểm tra var yêu cầu hoặc có lẽ là người giới thiệu? IOW: đây có thể là điểm khởi đầu. Ai khác? TIA --- JC
jchwebdev

À đúng rồi, đăng nhập wp không xử lý đăng xuất. Cười lớn. Đó là logic. Có lẽ mã này với một plugin sẽ đủ. Hãy để tôi xem những gì khác chúng ta có thể sử dụng vì tôi ghét sử dụng đăng nhập wp.
Androliyah

Tất cả những gì tôi nghĩ là cần thiết sẽ là giám sát các vars yêu cầu khi đăng nhập wp. Tôi không có một cái máy có thể làm điều đó ngay bây giờ.
jchwebdev

3

Thêm một var GET cho hành động đăng xuất và nó hoạt động tốt.

add_action('init','custom_login');

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

Cho đến nay, đây là gần nhất với những gì chúng ta muốn. Nếu chúng tôi xóa exit () và thay đổi wp_redirect thành trang đăng nhập tùy chỉnh của chúng tôi, nó dường như thực hiện công việc.
jchwebdev

3

Tôi đã sử dụng plugin WordPress Đổi tên wp-login.php khá lâu.

Nó cho phép bạn chuyển wp-login.phpsang bất kỳ con đường khác. Tôi đã có các bot đóng sầm các trang đăng nhập của mình và bây giờ tôi không nhận được lượt truy cập nào.


1

WP-login xử lý đăng nhập, đăng xuất, đăng ký, đặt lại mật khẩu và truy xuất. Giả sử bạn muốn thay đổi trang đăng nhập giao diện người dùng. Bạn có thể sử dụng mã sau đây một cách an toàn:

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

Đoạn mã này sẽ:

  1. Chuyển hướng tất cả khách truy cập trang web đến trang đăng nhập mới.
  2. Đăng xuất sẽ hoạt động mà không có vấn đề gì
  3. Trên trang đăng nhập tùy chỉnh của bạn, bạn sẽ phải tạo các biểu mẫu đăng nhập, đăng ký và đặt lại mật khẩu tùy chỉnh, tuy nhiên các biểu mẫu tùy chỉnh của bạn có thể đăng dữ liệu lên wp-login.php một cách an toàn vì các yêu cầu bài đăng không được chuyển hướng.

1
home_url()đã thêm một dấu gạch chéo hàng đầu, vì vậy không cần điều đó. Ngoài ra $pagenow(a) toàn cầu chỉ có trên quản trị viên (và có thể đăng nhập) và (b) nên được thay thế bằng get_current_screen()kiểm tra tài sản.
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);
}

Điều này sẽ chuyển hướng đến / đăng nhập thay vì hình thức đăng nhập wp khó chịu.


hmmm ý tưởng thú vị, nhưng vui lòng giải thích cách thức / lý do tại sao nó hoạt động
Mark Kaplun

Điều này sẽ không hoạt động. Bộ lọc này yêu cầu url đăng nhập thông qua login_url (), nó không ngăn ai đó gõ thủ công wp-login.php.
Matt

0

Nếu ý định của bạn là bảo vệ wp-login.phpkhỏi người lạ thậm chí có thể nhìn thấy nó, cách hiệu quả đơn giản nhất là yêu cầu ủy quyền (xác thực cơ bản) để truy cập wp-login.php.

Trong Apache, auth được triển khai thông qua sự kết hợp của htaccess và tệp mật khẩu . Lần đầu tiên, trong một phiên trình duyệt, bất kỳ ai cố gắng truy cập, wp-login.phphọ sẽ được nhắc nhập tên người dùng và mật khẩu (trước khi đăng nhập wordpress).

Để đơn giản hóa mọi thứ, tên người dùng và mật khẩu này có thể giống nhau cho mọi người bạn muốn cấp quyền truy cập wp-login.php, vì họ vẫn phải nhập thông tin đăng nhập wordpress sau khi vượt qua hộp thoại auth đầu tiên.


Hấp dẫn. Tôi giả sử 'dấu nhắc' là cửa sổ bật lên theo phương thức của trình duyệt để nhập thông tin đăng nhập. Tôi nghĩ rằng điều đó sẽ gây nhầm lẫn. Lý tưởng nhất là những gì tôi muốn là cho URL đó thực hiện -noth -... hoặc có lẽ chỉ cần chuyển hướng đến trang chủ. Nhưng cảm ơn vì điều đó. Học điều mới mỗi ngày!
jchwebdev

Những gì bạn đang nghĩ rằng bạn đang làm là "bảo mật thông qua tối nghĩa". Nhưng trong thực tế, bạn chỉ đang làm tối nghĩa, và đó là khủng khiếp. Đừng sử dụng nó. Auth là bảo mật. Ẩn điểm vào là tối nghĩa. security.stackexchange.com/questions/32064/
Mạnh

1
Nói cách khác, ngay cả khi bạn thay đổi vị trí đăng nhập wp, bạn vẫn cần sử dụng auth: "Tôi có nên dựa vào việc thay đổi máy chủ từ 22 sang cổng 2222 để giữ an toàn cho kết nối của mình không? Máy chủ SSH đến cổng 2222 trong khi cũng sử dụng mật khẩu? Không, nếu có bất cứ điều gì đây là giải pháp tốt nhất. Thay đổi ("che khuất"), cổng sẽ đơn giản cắt giảm một đống máy quét khai thác tự động tìm kiếm các cổng thông thường. che khuất điều đó là tốt, nhưng chúng tôi không tính đến sự tối nghĩa. Nếu họ tìm thấy nó, họ vẫn cần phải bẻ khóa mật khẩu. "
Gaia

Cảm ơn vì điều đó. Tôi đã học được rất nhiều. Không phải những gì tôi đang tìm kiếm, nhưng vẫn ... rất hữu ích. Tốt nhất --- JC
jchwebdev

0

Thay thế $pageidbằng trang bạn muốn người dùng được chuyển hướng đến

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

Ví dụ trang đăng nhập tùy chỉnh của tôi. Lưu login.php và đặt mã

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

trong functions.php


Bạn có thể vui lòng chỉnh sửa câu hỏi của bạn và giải thích lý do tại sao câu trả lời này tốt hơn câu trả lời trước đó hoặc chính xác những gì bạn đang làm những gì bạn đang làm. Mã chỉ trả lời thường được nhăn mặt mà không có một số giải thích.
Howdy_McGee

mã này chuyển wp-login.php sang login.php với mã tùy chỉnh của tôi dựa trên bootstrap Nó có thể ngăn bot tự động hoặc đoán url mặc định. sử dụng có thể thay đổi <i> đăng nhập </ i> thành cụm từ những gì bạn muốn. Và không ai biết trực tiếp đăng nhập url trích dẫn bạn.
Rei
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.