ปิดใช้งานหรือเปลี่ยนเส้นทาง WP-login.php


10

มีวิธีป้องกันผู้เยี่ยมชมไม่ว่าจะเข้าสู่ระบบหรือไม่ถึงmysite.com/wp-login.php?

ฉันมีแบบฟอร์มการเข้าสู่ระบบแยกต่างหากซึ่งเป็นสิ่งที่เราต้องการ ฉันรู้ว่าฉันสามารถจัดรูปแบบที่สร้างขึ้นใหม่ได้wp-loginแต่ฉันไม่ต้องจัดการกับมันเลย ฉันลองใช้ตัวกรองและตะขอต่าง ๆ และดูเหมือนว่าฉันจะไม่สามารถเปลี่ยนเส้นทางได้ ฉันลองใช้การ.htaccessเปลี่ยนเส้นทางและพบว่ามันใช้งานได้ แต่ก็ป้องกันไม่ให้แบบฟอร์มเข้าสู่ระบบ / ออกจากระบบที่กำหนดเองของฉันทำงานได้

ไอเดีย?


คุณทำสิ่งนี้ด้วยเหตุผลด้านความปลอดภัยหรือไม่ ทำไมไม่ใช้การรับรองความถูกต้องสำหรับ wp-login.php เท่านั้น
Gaia

ฉันไม่รู้ว่าคุณหมายถึงอะไร กรุณาขยายอีกหน่อย TIA
jchwebdev

ทำไมคุณต้องใช้แบบฟอร์มเข้าสู่ระบบแยกต่างหาก เพื่อเหตุผลด้านความปลอดภัย?
Gaia

เราพบว่าผู้คนจำนวนมากเกินไปในทุกวันนี้ตระหนักถึง 'การลงชื่อเข้าใช้ wp' เราต้องการที่จะไม่ชัดเจนมากนัก คุณสามารถบอกฉันได้ไหมว่า 'ทำไมไม่ใช้การรับรองความถูกต้อง' หมายถึงอะไร TIA
jchwebdev

ดูคำตอบที่ให้ไว้
Gaia

คำตอบ:


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-Login หากพวกเขาเข้าสู่ PW ที่ไม่ถูกต้องควรเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบที่กำหนดเองของเรา
jchwebdev

แก้ไขแล้วและตอนนี้ใช้ได้: คุณต้องตรวจสอบว่ามีการกรอก $ action ก่อนที่จะทำ in_array ()
simonthesorcerer

สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันยังสามารถเข้าสู่ระบบได้
Mike

@Mike - คุณแน่ใจหรือว่าเบ็ดของคุณกำลังทำงาน /? จะเกิดอะไรขึ้นถ้าคุณใส่echo "HERE";เข้าไปในฟังก์ชั่น? มันสะท้อน?
random_user_name

1
@cale_b ใช่ตะขอทำงานได้ดี ปัญหาคือว่า$_GET['action']ว่างเปล่าสำหรับฉัน แบบฟอร์มถูกโพสต์ไปที่/wp-login.php(โดยไม่มีตัวแปร GET ใด ๆ ใน URL) และดูที่แหล่งที่มาไม่มีแม้แต่ชื่อที่ใส่ไว้actionดังนั้นแม้$_REQUEST['action']จะว่างเปล่า
Mike

10

ลองทำสิ่งนี้ในฟังก์ชั่นของธีมของคุณ

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 จัดการการล็อกเอาต์เช่นกัน
Brian Fegter

ใช่สิ่งนี้บล็อกรูปแบบการเข้าสู่ระบบที่กำหนดเองของฉัน แต่ถ้ามีวิธีตรวจสอบคำขอ var หรือผู้อ้างอิงได้อย่างน่าเชื่อถือ IOW: นี่อาจเป็นจุดเริ่มต้น ใครอีกไหม? TIA --- JC
jchwebdev

อ่าใช่ wp-login จัดการการออกจากระบบ ฮ่า ๆ. นั่นคือเหตุผล บางทีรหัสนี้กับปลั๊กอินจะพอเพียง ให้ฉันดูว่าเราสามารถใช้อะไรได้อีกเพราะฉันเกลียดการใช้ wp-login
Androliyah

ทั้งหมดที่ฉันคิดว่าเป็นสิ่งที่จำเป็นคือการตรวจสอบ vars คำขอเมื่อโหลด 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();
 }
}

จนถึงตอนนี้มันใกล้เคียงกับสิ่งที่เราต้องการ หากเราลบ exit () และเปลี่ยน wp_redirect เป็นหน้าเข้าสู่ระบบที่กำหนดเองของเราดูเหมือนว่าจะทำงาน
jchwebdev

3

ฉันใช้ปลั๊กอิน WordPress เปลี่ยนชื่อ wp-login.php มานานพอสมควร

มันช่วยให้คุณเปลี่ยนwp-login.phpไปใช้เส้นทางอื่นได้ ฉันกำลังบอทสแลหน้าเข้าสู่ระบบของฉันและตอนนี้ฉันได้รับความนิยมเป็นศูนย์


1

WP-login จัดการล็อกอิน, ล็อกเอาต์, การลงทะเบียน, รีเซ็ตรหัสผ่านและดึงข้อมูล สมมติว่าคุณต้องการเปลี่ยนหน้าเข้าสู่ระบบส่วนหน้า คุณสามารถใช้รหัสต่อไปนี้อย่างปลอดภัย:

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

สิ่งนี้จะเปลี่ยนเส้นทางไปที่ / เข้าสู่ระบบแทนแบบฟอร์ม wp-login ที่น่ารังเกียจ


แนวคิดที่น่าสนใจ แต่โปรดอธิบายว่ามันทำงานอย่างไร
Mark Kaplun

สิ่งนี้จะไม่ทำงาน ตัวกรองนี้ร้องขอ URL การเข้าสู่ระบบผ่านทาง login_url () มันไม่ได้ป้องกันบางคนจากการพิมพ์ wp-login.php ด้วยตนเอง
Matt

0

ถ้าความตั้งใจของคุณคือการปกป้องwp-login.phpจากคนแปลกหน้าแม้กระทั่งความสามารถที่จะเห็นมันเป็นวิธีที่มีประสิทธิภาพที่ง่ายที่สุดที่จะทำคือจะต้องมีการอนุมัติ (รับรองความถูกต้องพื้นฐาน) wp-login.phpในการเข้าถึง

ในApache, รับรองความถูกต้องจะดำเนินการผ่านการรวมกันของ htaccess ไฟล์และรหัสผ่าน ครั้งแรกภายในเซสชันของเบราว์เซอร์ที่ทุกคนพยายามเข้าถึงwp-login.phpพวกเขาจะได้รับแจ้งให้ป้อนชื่อผู้ใช้และรหัสผ่าน (ก่อนเข้าสู่ระบบของ wordpress)

เพื่อให้สิ่งต่าง ๆ ง่ายขึ้นชื่อผู้ใช้และรหัสผ่านนี้สามารถเหมือนกันสำหรับทุกคนที่คุณต้องการให้การเข้าถึงwp-login.phpเนื่องจากพวกเขายังคงต้องป้อนการเข้าสู่ระบบ WordPress ของพวกเขาหลังจากที่ประสบความสำเร็จในการผ่านครั้งแรก


น่าสนใจ ฉันสมมติว่า 'พรอมต์' เป็นป๊อปอัพที่เป็นกิริยาช่วยของเบราว์เซอร์สำหรับการป้อนข้อมูลรับรอง ฉันคิดว่ามันจะทำให้เกิดความสับสน นึกคิดสิ่งที่ฉันต้องการคือการที่ URL ที่จะทำ -nothing -... หรืออาจเพียงแค่เปลี่ยนเส้นทางไปที่หน้าแรก แต่ขอบคุณสำหรับสิ่งนั้น เรียนรู้สิ่งใหม่ทุกวัน!
jchwebdev

สิ่งที่คุณคิดว่าคุณกำลังทำคือ "ความปลอดภัยผ่านความสับสน" แต่ในความเป็นจริงคุณเพียง แต่กำลังสับสนและนั่นแย่มาก อย่าใช้มัน รับรองความถูกต้องคือความปลอดภัย การซ่อนจุดเข้านั้นไม่ชัดเจน security.stackexchange.com/questions/32064/…
Gaia

1
กล่าวอีกนัยหนึ่งแม้ว่าคุณจะเปลี่ยนตำแหน่งของ wp-login คุณยังคงต้องใช้การรับรองความถูกต้อง: "ฉันควรจะพึ่งพาการเปลี่ยนเซิร์ฟเวอร์จาก 22 เป็นพอร์ต 2222 เพื่อให้การเชื่อมต่อของฉันปลอดภัยหรือไม่ไม่เปลี่ยนของฉันไม่ดี เซิร์ฟเวอร์ SSH ไปยังพอร์ต 2222 ในขณะที่ใช้รหัสผ่านด้วยหรือไม่ไม่หากสิ่งนี้เป็นทางออกที่ดีที่สุดการเปลี่ยน ("การปิดบัง") พอร์ตนั้นจะลดจำนวนลงของเครื่องสแกนหาประโยชน์โดยอัตโนมัติที่ค้นหาพอร์ตปกติ ความคลุมเครือซึ่งเป็นสิ่งที่ดี แต่เราไม่ได้นับความสับสนหากพวกเขาพบว่าพวกเขายังคงต้องถอดรหัสรหัสผ่าน "
Gaia

ขอบคุณสำหรับสิ่งนั้น ฉันเรียนรู้มาก ไม่ใช่สิ่งที่ฉันกำลังมองหา แต่ก็ยัง ... มีประโยชน์มาก ดีที่สุด --- 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 ด้วยรหัสที่กำหนดเองของฉันตาม bootstrap มันสามารถป้องกันบอทอัตโนมัติหรือคาดเดา URL เริ่มต้น ใช้สามารถเปลี่ยน <i> ล็อกอิน </i> เป็นวลีที่คุณต้องการและไม่มีใครรู้ว่าลงชื่อเข้าใช้ URL ที่ตัดตอนมาจากคุณโดยตรง
Rei
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.