Nonaktifkan Atau Redirect WP-login.php


10

Apakah ada cara untuk mencegah pengunjung, apakah masuk atau tidak, dari mencapai mysite.com/wp-login.php?

Saya memiliki formulir login terpisah yang kami butuhkan. Saya tahu saya bisa mendesain ulang bentuk yang dihasilkan oleh wp-logintetapi saya lebih suka tidak harus berurusan dengan itu sama sekali. Saya sudah mencoba berbagai filter dan pengait dan sepertinya saya tidak bisa mengalihkannya. Saya juga mencoba menggunakan .htaccesspengalihan dan saya menemukan bahwa ini berfungsi, tetapi kemudian mencegah form login / logout kustom saya tidak berfungsi.

Ide ide?


apakah Anda melakukan ini untuk alasan keamanan? mengapa tidak menerapkan auth hanya untuk wp-login.php?
Gaia

Saya tidak tahu apa yang Anda maksud dengan itu. Harap perluas sedikit. TIA.
jchwebdev

MENGAPA Anda memerlukan formulir login terpisah? untuk alasan keamanan?
Gaia

Kami mendapati bahwa saat ini terlalu banyak orang yang mengetahui 'wp-login'. Kami lebih suka tidak begitu jelas. Bisakah Anda memberi tahu saya apa artinya 'mengapa tidak menerapkan auth'? TIA
jchwebdev

lihat jawaban yang disediakan.
Gaia

Jawaban:


18

Setelah menemukan pertanyaan ini, dan menguji beberapa jawaban, di bawah ini adalah versi "dibersihkan" dari apa yang saya gunakan di lingkungan produksi.

Versi ini tidak membuang pemberitahuan / kesalahan, dan juga memungkinkan pengaturan ulang kata sandi berfungsi:

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

Ini tampaknya mencegah WP-Login (bagus) tetapi jalan keluar akhir () tampaknya mencegah masuk yang sebenarnya () terjadi sama sekali yang bukan yang kita inginkan. Kami ingin orang-orang dapat masuk, tidak pernah melihat layar WP-Login. Jika mereka memasukkan PW yang salah, itu harus diarahkan ke halaman login kustom kami.
jchwebdev

Diedit & itu sekarang berfungsi: Anda harus memeriksa apakah $ action diisi sebelum melakukan in_array ()
simonthesorcerer

Ini tidak berhasil untuk saya. Saya masih bisa masuk.
Mike

@ Mike - Apakah Anda yakin kail Anda bekerja? Apa yang terjadi jika Anda memasukkan echo "HERE";fungsi? Apakah itu bergema?
random_user_name

1
@cale_b Ya, pengait bekerja dengan baik. Masalahnya adalah itu $_GET['action']kosong untuk saya. Formulir diposting ke /wp-login.php(tanpa variabel GET di URL) dan melihat sumber bahkan tidak ada di put bernama action, sehingga bahkan $_REQUEST['action']kosong.
Mike

10

Coba ini di functions.php tema Anda

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

bekerja untuk saya tetapi saya memiliki masalah logout & tidak tahu mengapa
Androliyah

7
Karena wp-login.php juga menangani keluar.
Brian Fegter

Ya, ini memblokir formulir login khusus saya. Tetapi apakah ada cara untuk memeriksa permintaan var atau rujukan? TKI: ini mungkin titik awal. Ada orang lain TIA --- JC
jchwebdev

Ah ya, wp-login memang menangani keluar. Lol. Itu logis. Mungkin kode dengan plugin ini sudah cukup. Biarkan saya melihat apa lagi yang bisa kita gunakan karena saya benci menggunakan wp-login.
Androliyah

Yang saya pikir perlu adalah memantau permintaan vars ketika wp-login dimuat. Saya hanya tidak punya mesin yang bisa melakukan itu sekarang.
jchwebdev

3

Tambahkan GET var untuk tindakan logout dan berfungsi dengan baik.

add_action('init','custom_login');

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

Sejauh ini, ini yang terdekat dengan yang kita inginkan. Jika kami menghapus pintu keluar () dan mengubah wp_redirect ke halaman login kustom kami, tampaknya melakukan pekerjaan.
jchwebdev

3

Saya telah menggunakan plugin WordPress Rename wp-login.php selama beberapa waktu.

Ini memungkinkan Anda beralih wp-login.phpke jalur lain. Saya memiliki bot yang membanting halaman login saya, dan sekarang saya mendapatkan nol hit.


1

WP-login menangani login, logout, registrasi, reset dan pengambilan kata sandi. Dengan asumsi Anda ingin mengubah halaman login front-end. Anda dapat menggunakan kode berikut dengan aman:

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

Cuplikan kode ini akan:

  1. Arahkan ulang semua pengunjung situs web ke halaman login baru.
  2. Logout akan berfungsi tanpa masalah
  3. Pada halaman login kustom Anda, Anda harus membuat form login kustom, registrasi dan reset kata sandi, Namun formulir kustom Anda dapat dengan aman mengirim data ke wp-login.php karena permintaan posting tidak dialihkan.

1
home_url()sudah menambahkan garis miring, jadi tidak perlu untuk itu. Juga $pagenow(a) global yang hanya ada di admin (dan mungkin login) dan (b) harus diganti dengan get_current_screen()pemeriksaan properti.
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);
}

Ini akan mengarahkan ulang ke / login daripada formulir wp-login yang tidak menyenangkan.


hmmm ide yang menarik, tapi tolong jelaskan bagaimana / mengapa itu bekerja
Mark Kaplun

Ini tidak akan berfungsi. Ini memfilter permintaan untuk url login melalui login_url (), itu tidak mencegah seseorang mengetik secara manual wp-login.php.
Matt

0

Jika niat Anda adalah untuk melindungi wp-login.phpdari orang asing bahkan dapat melihatnya, cara paling efisien yang paling sederhana untuk melakukannya adalah dengan memerlukan otorisasi (auth dasar) untuk mengakses wp-login.php.

Di Apache, auth diimplementasikan melalui kombinasi htaccess dan file kata sandi . Pertama kali, dalam sesi browser, siapa pun yang mencoba mengaksesnya wp-login.phpakan diminta memasukkan nama pengguna dan kata sandi (sebelum login wordpress).

Untuk mempermudah, nama pengguna dan kata sandi ini bisa sama untuk setiap orang yang ingin Anda akses wp-login.php, karena mereka masih harus memasukkan login wordpress mereka setelah berhasil melewati kotak dialog auth yang pertama.


Menarik. Saya berasumsi 'prompt' adalah modal popup browser untuk memasukkan kredensial. Saya pikir itu akan menyebabkan kebingungan. Idealnya yang saya inginkan adalah URL itu melakukan -tidak ada -... atau mungkin hanya mengarahkan ke halaman rumah. Tapi terima kasih untuk itu. Pelajari sesuatu yang baru setiap hari!
jchwebdev

Apa yang Anda pikir sedang Anda lakukan adalah "keamanan melalui ketidakjelasan". Tetapi pada kenyataannya Anda hanya melakukan ketidakjelasan, dan itu mengerikan. Jangan gunakan itu. Auth adalah keamanan. Menyembunyikan titik masuk adalah ketidakjelasan. security.stackexchange.com/questions/32064/...
Gaia

1
Dengan kata lain, bahkan JIKA Anda mengubah lokasi login-wp, Anda masih perlu menggunakan auth: "Haruskah saya mengandalkan mengubah server dari 22 ke port 2222 untuk menjaga koneksi saya aman? Sama sekali tidak. Apakah buruk untuk mengubah saya SSH server ke port 2222 sementara juga menggunakan kata sandi? Tidak, jika ada ini adalah solusi terbaik. Mengubah ("Mengaburkan") port hanya akan mengurangi tumpukan scanner eksploit otomatis mencari port normal. Kami mendapatkan keuntungan keamanan melalui ketidakjelasan yang baik, tetapi kami tidak mengandalkan ketidakjelasan itu. Jika mereka menemukannya mereka masih perlu memecahkan kata sandi. "
Gaia

Terima kasih untuk itu. Aku belajar banyak. Bukan apa yang saya cari, tetapi masih ... sangat membantu. Terbaik --- JC
jchwebdev

0

Ganti $pageiddengan halaman yang Anda inginkan agar pengguna diarahkan

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

Contoh halaman login kustom saya. Menyimpan login.php dan memasukkan kode

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

di functions.php


Bisakah Anda mengedit pertanyaan Anda dan menjelaskan mengapa jawaban ini lebih baik daripada jawaban sebelumnya atau apa tepatnya yang Anda lakukan. Kode hanya jawaban yang biasanya disukai tanpa semacam penjelasan.
Howdy_McGee

kode ini beralih wp-login.php ke login.php dengan kode khusus saya berdasarkan bootstrap Ini dapat mencegah bot otomatis atau menebak url default. gunakan dapat mengubah <i> login </i> ke frase yang Anda inginkan. dan tidak ada yang tahu langsung login url Anda.
Rei
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.