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?

jchwebdev
sumber
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();
    }
}
random_user_name
sumber
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();
 }
}
Androliyah
sumber
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();
 }
}
dekan
sumber
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.

gdaniel
sumber
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.
Fiaz Husyn
sumber
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.

Corysimmons
sumber
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.

Gaia
sumber
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' );
Mohamed Omar
sumber
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

Rei
sumber
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