Deaktiviere oder leite WP-login.php um


10

Gibt es eine Möglichkeit zu verhindern, dass angemeldete oder nicht angemeldete Besucher erreichen mysite.com/wp-login.php?

Ich habe ein separates Anmeldeformular, das alles ist, was wir brauchen. Ich weiß, dass ich das von generierte Formular neu gestalten kann, wp-loginaber ich möchte mich lieber überhaupt nicht damit befassen müssen. Ich habe verschiedene Filter und Hooks ausprobiert und kann sie anscheinend nicht umleiten. Ich habe auch versucht, eine .htaccessUmleitung zu verwenden, und festgestellt, dass dies funktioniert, aber dann verhindert es, dass mein benutzerdefiniertes Anmelde- / Abmeldeformular funktioniert.

Ideen?


Tun Sie dies aus Sicherheitsgründen? Warum nicht nur auth für wp-login.php implementieren?
Gaia

Ich weiß nicht, was du damit meinst. Bitte etwas erweitern. TIA.
Jchwebdev

WARUM benötigen Sie ein separates Anmeldeformular? aus Sicherheitsgründen?
Gaia

Wir stellen fest, dass heutzutage zu viele Menschen das "wp-login" kennen. Wir möchten lieber nicht, dass das so offensichtlich ist. Können Sie mir einfach sagen, was "Warum nicht Auth implementieren?" Bedeutet? TIA
jchwebdev

siehe Antwort.
Gaia

Antworten:


17

Nachdem Sie diese Frage gefunden und einige der Antworten getestet haben, ist das Folgende eine "bereinigte" Version dessen, was ich in einer Produktionsumgebung verwende.

Diese Version gibt keine Hinweise / Fehler aus und ermöglicht auch das Zurücksetzen von Passwörtern:

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

Dies scheint WP-Login (gut) zu verhindern, aber das endgültige Beenden () scheint zu verhindern, dass das eigentliche Login () überhaupt auftritt, was nicht das ist, was wir wollen. Wir möchten, dass sich Benutzer anmelden können, ohne den WP-Anmeldebildschirm zu sehen. Wenn sie eine falsche PW eingeben, sollte diese zu unserer benutzerdefinierten Anmeldeseite weitergeleitet werden.
Jchwebdev

Bearbeitet und es funktioniert jetzt: Sie müssen überprüfen, ob $ action gefüllt ist, bevor Sie in_array ()
simonthesorcerer

Das hat bei mir nicht funktioniert. Ich konnte mich noch einloggen.
Mike

@ Mike - Bist du sicher, dass dein Haken nimmt / funktioniert? Was passiert, wenn Sie echo "HERE";die Funktion eingeben? Echo es?
random_user_name

1
@cale_b Ja, der Hook funktioniert einwandfrei. Das Problem ist, dass $_GET['action']es für mich leer ist. Das Formular wird an /wp-login.php(ohne GET-Variablen in der URL) gesendet, und wenn Sie sich die Quelle ansehen, gibt es nicht einmal einen eingegebenen Namen action, der sogar $_REQUEST['action']leer ist.
Mike

10

Versuchen Sie dies in der functions.php Ihres Themas

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

Ich arbeite für mich, aber ich habe Probleme beim
Abmelden

7
Weil wp-login.php auch das Abmelden übernimmt.
Brian Fegter

Ja, dies blockiert mein benutzerdefiniertes Anmeldeformular. Aber ob es eine Möglichkeit gab, zuverlässig nach der Anforderungsvariable oder vielleicht nach dem Referer zu suchen? IOW: Dies könnte ein Ausgangspunkt sein. Irgendjemand anderes? TIA --- JC
jchwebdev

Ah ja, wp-login übernimmt das Abmelden. Lol. Das ist logisch. Vielleicht reicht dieser Code mit einem Plugin aus. Lassen Sie mich sehen, was wir sonst noch verwenden können, weil ich es hasse, wp-login zu verwenden.
Androliyah

Alles, was ich für notwendig halte, wäre, die Anforderungsvariablen zu überwachen, wenn wp-login geladen wird. Ich habe gerade keine Maschine, die das kann.
Jchwebdev

3

Fügen Sie eine GET-Variable für die Abmeldeaktion hinzu, und es funktioniert einwandfrei.

add_action('init','custom_login');

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

Bisher kommt dies dem, was wir wollen, am nächsten. Wenn wir exit () entfernen und wp_redirect in unsere benutzerdefinierte Anmeldeseite ändern, scheint dies den Job zu erledigen.
Jchwebdev

3

Ich benutze das WordPress-Plugin Rename wp-login.php seit einiger Zeit .

Sie können wp-login.phpzu einem anderen Pfad wechseln . Ich hatte Bots, die meine Anmeldeseiten zuschlagen, und jetzt bekomme ich null Treffer.


1

WP-Login übernimmt das Anmelden, Abmelden, Registrieren, Zurücksetzen des Passworts und Abrufen. Angenommen, Sie möchten die Front-End-Anmeldeseite ändern. Sie können den folgenden Code sicher verwenden:

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

Dieses Code-Snippet wird:

  1. Leiten Sie alle Website-Besucher auf eine neue Anmeldeseite weiter.
  2. Das Abmelden funktioniert problemlos
  3. Auf Ihrer benutzerdefinierten Anmeldeseite müssen Sie benutzerdefinierte Anmelde-, Registrierungs- und Kennwortrücksetzformulare erstellen. Ihre benutzerdefinierten Formulare können jedoch sicher Daten an wp-login.php senden, da Postanfragen nicht umgeleitet werden.

1
home_url()fügt bereits einen führenden Schrägstrich hinzu, daher ist dies nicht erforderlich. Außerdem $pagenowist (a) ein Global, das nur beim Administrator vorhanden ist (und möglicherweise beim Login), und (b) sollte durch get_current_screen()Eigenschaftsprüfungen ersetzt werden.
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);
}

Dies wird zu / login anstelle des fiesen wp-login-Formulars umleiten.


hmmm interessante Idee, aber bitte erklären Sie, wie / warum es funktioniert
Mark Kaplun

Dies wird nicht funktionieren. Dies filtert Anforderungen für die Anmelde-URL über login_url () und verhindert nicht, dass jemand wp-login.php manuell eingibt.
Matt

0

Wenn Sie wp-login.phpvor Fremden schützen möchten, die es überhaupt sehen können, ist es am einfachsten, eine Autorisierung (Basisauthentifizierung) für den Zugriff zu benötigen wp-login.php.

In Apache wird die Authentifizierung über eine Kombination aus htaccess und einer Kennwortdatei implementiert . Wenn jemand innerhalb einer Browsersitzung zum ersten Mal versucht, auf ihn zuzugreifen wp-login.php, wird er aufgefordert, einen Benutzernamen und ein Kennwort einzugeben (vor der WordPress-Anmeldung).

Zur Vereinfachung können dieser Benutzername und dieses Kennwort für jede Person, auf die Sie Zugriff gewähren möchten, gleich sein wp-login.php, da sie nach erfolgreichem Überschreiten des ersten Dialogfelds für die Authentifizierung noch ihre WordPress-Anmeldung eingeben müssen.


Interessant. Ich gehe davon aus, dass die 'Eingabeaufforderung' das modale Popup des Browsers zur Eingabe von Anmeldeinformationen ist. Ich denke, das würde Verwirrung stiften. Im Idealfall möchte ich, dass diese URL nichts tut oder einfach zur Startseite weiterleitet. Aber danke dafür. Lerne jeden Tag etwas Neues!
Jchwebdev

Was Sie zu tun glauben, ist "Sicherheit durch Dunkelheit". Aber in Wirklichkeit machst du nur Dunkelheit, und das ist schrecklich. Benutze es nicht. Auth ist Sicherheit. Das Verstecken des Eingangspunkts ist dunkel. security.stackexchange.com/questions/32064/…
Gaia

1
Mit anderen Worten, selbst wenn Sie den Speicherort der wp-Anmeldung ändern, müssen Sie auth verwenden: "Sollte ich mich darauf verlassen, den Server von 22 auf Port 2222 zu ändern, um meine Verbindung sicher zu halten? Absolut nicht. Ist es schlecht, meine zu ändern." SSH-Server an Port 2222 unter Verwendung eines Kennworts? Nein, wenn überhaupt, ist dies die beste Lösung. Durch Ändern ("Verschleiern") des Ports wird einfach ein Haufen automatischer Exploit-Scanner reduziert, die normale Ports durchsuchen. Wir erhalten dadurch einen Sicherheitsvorteil Dunkelheit, die gut ist, aber wir zählen nicht auf die Dunkelheit. Wenn sie sie gefunden haben, müssen sie das Passwort immer noch knacken. "
Gaia

Dank dafür. Ich habe viel gelernt. Nicht das, wonach ich gesucht habe, aber trotzdem ... sehr hilfreich. Beste --- JC
jchwebdev

0

Ersetzen Sie $pageiddurch die Seite, auf die Benutzer umgeleitet werden sollen

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

Beispiel meine benutzerdefinierte Anmeldeseite. Speichern Sie login.php und geben Sie Code ein

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

im functions.php


Könnten Sie bitte Ihre Frage bearbeiten und erklären, warum diese Antwort besser ist als die vorherigen Antworten oder was genau Sie tun, was Sie tun. Nur-Code-Antworten werden normalerweise ohne Erklärung verpönt.
Howdy_McGee

Dieser Code wechselt wp-login.php zu login.php mit meinem benutzerdefinierten Code basierend auf Bootstrap. Er kann Auto-Bot verhindern oder Standard-URL erraten. Verwenden Sie kann <i> Login </ i> ändern, um zu formulieren, was Sie wollen. Und niemand weiß, direkt Login-URL-Auszug Sie.
Rei
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.