Désactiver ou rediriger WP-login.php


10

Existe-t-il un moyen d'empêcher les visiteurs, qu'ils soient connectés ou non, d'atteindre mysite.com/wp-login.php?

J'ai un formulaire de connexion séparé, c'est tout ce dont nous avons besoin. Je sais que je peux remodeler le formulaire généré par wp-loginmais je préfère ne pas avoir à y faire face du tout. J'ai essayé divers filtres et crochets et je n'arrive pas à le faire rediriger. J'ai également essayé d'utiliser une .htaccessredirection et j'ai constaté que cela fonctionne, mais cela empêche mon formulaire de connexion / déconnexion personnalisé de fonctionner.

Des idées?


faites-vous cela pour des raisons de sécurité? pourquoi ne pas implémenter auth pour wp-login.php uniquement?
Gaia

Je ne sais pas ce que tu veux dire par là. Veuillez développer un peu. TIA.
jchwebdev

POURQUOI avez-vous besoin d'un formulaire de connexion distinct? pour des raisons de sécurité?
Gaia

Nous constatons que trop de gens de nos jours sont au courant de la «connexion wp». Nous préférons que cela ne soit pas aussi évident. Pouvez-vous me dire ce que signifie «pourquoi ne pas implémenter l'auth»? TIA
jchwebdev

voir la réponse fournie.
Gaia

Réponses:


18

Après avoir trouvé cette question et testé quelques-unes des réponses, ce qui suit est une version "nettoyée" de ce que j'utilise dans un environnement de production.

Cette version ne génère aucun avis / erreur et permet également la réinitialisation du mot de passe:

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

Cela semble empêcher WP-Login (bon) mais la sortie finale () semble empêcher la connexion réelle () de se produire, ce qui n'est pas ce que nous voulons. Nous voulons que les gens puissent se connecter, mais ne voient jamais l'écran WP-Login. S'ils entrent un PW incorrect, il devrait rediriger vers notre page de connexion personnalisée.
jchwebdev

Modifié et cela fonctionne maintenant: vous devez vérifier si l'action $ est remplie avant de faire in_array ()
simonthesorcerer

Ça n'a pas marché pour moi. Je pourrais toujours me connecter.
Mike

@Mike - Êtes-vous sûr que votre crochet prend / fonctionne? Que se passe-t-il si vous mettez echo "HERE";à l'intérieur de la fonction? Cela fait-il écho?
random_user_name

1
@cale_b Oui, le crochet fonctionne bien. Le problème est que $_GET['action']c'est vide pour moi. Le formulaire est publié dans /wp-login.php(sans aucune variable GET dans l'URL) et en regardant la source, il n'y a même pas d'entrée nommée action, donc même $_REQUEST['action']vide.
Mike

10

Essayez ceci dans les fonctions de votre thème.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();
 }
}

travaille pour moi, mais j'ai des problèmes de
déconnexion

7
Parce que wp-login.php gère également la déconnexion.
Brian Fegter

Oui, cela bloque mon formulaire de connexion personnalisé. Mais s'il y avait un moyen de vérifier de manière fiable la requête var ou peut-être le référent? IOW: cela pourrait être un point de départ. Quelqu'un d'autre? TIA --- JC
jchwebdev

Ah oui, wp-login gère la déconnexion. Lol. C'est logique. Peut-être que ce code avec un plugin suffira. Permettez-moi de voir ce que nous pouvons utiliser d'autre parce que je déteste utiliser wp-login.
Androliyah

Tout ce que je pense être nécessaire serait de surveiller les vars de demande lorsque wp-login est chargé. Je n'ai tout simplement pas de machine capable de le faire en ce moment.
jchwebdev

3

Ajoutez une var GET pour l'action de déconnexion et cela fonctionne très bien.

add_action('init','custom_login');

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

Jusqu'à présent, c'est le plus proche de ce que nous voulons. Si nous supprimons l'exit () et changeons le wp_redirect en notre page de connexion personnalisée, il semble faire le travail.
jchwebdev

3

J'utilise le plugin WordPress Rename wp-login.php depuis un certain temps.

Il vous permet de passer wp-login.phpà n'importe quel autre chemin. J'avais des robots qui claquaient mes pages de connexion, et maintenant je n'ai plus de résultats.


1

WP-login gère la connexion, la déconnexion, l'enregistrement, la réinitialisation du mot de passe et la récupération. En supposant que vous souhaitiez modifier la page de connexion frontale. Vous pouvez utiliser en toute sécurité le code suivant:

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

Cet extrait de code:

  1. Redirigez tous les visiteurs du site Web vers une nouvelle page de connexion.
  2. La déconnexion fonctionnera sans aucun problème
  3. Sur votre page de connexion personnalisée, vous devrez créer des formulaires de connexion, d'enregistrement et de réinitialisation de mot de passe personnalisés.Cependant, vos formulaires personnalisés peuvent publier des données en toute sécurité sur wp-login.php car les demandes de publication ne sont pas redirigées.

1
home_url()ajoute déjà une barre oblique, donc pas besoin de ça. Est également $pagenow(a) un global qui n'est présent que sur admin (et peut-être la connexion) et (b) devrait être remplacé par get_current_screen()des vérifications de propriétés.
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);
}

Cela redirigera vers / login au lieu du méchant formulaire wp-login.


hmmm idée intéressante, mais veuillez expliquer comment / pourquoi cela fonctionne
Mark Kaplun

Cela ne fonctionnera pas. Cela filtre les requêtes pour l'URL de connexion via login_url (), cela n'empêche pas quelqu'un de taper manuellement wp-login.php.
Matt

0

Si votre intention est de vous protéger wp-login.phpdes étrangers même de pouvoir le voir, le moyen le plus simple et efficace de le faire est d'exiger une autorisation (autorisation de base) pour accéder wp-login.php.

Dans Apache, l'auth est implémenté via une combinaison de htaccess et d'un fichier de mots de passe . La première fois, au cours d'une session de navigation, que quiconque essaie d'accéder, wp-login.phpil sera invité à entrer un nom d'utilisateur et un mot de passe (avant la connexion wordpress).

Pour simplifier les choses, ce nom d'utilisateur et ce mot de passe peuvent être les mêmes pour toutes les personnes auxquelles vous souhaitez donner accès wp-login.php, car elles doivent toujours entrer leur connexion wordpress après avoir réussi à passer la première boîte de dialogue d'authentification.


Intéressant. Je suppose que l '«invite» est la fenêtre contextuelle modale du navigateur pour la saisie des informations d'identification. Je pense que cela créerait de la confusion. Idéalement, ce que je veux, c'est que cette URL ne fasse rien - ou peut-être simplement redirige vers la page d'accueil. Mais merci pour ça. Apprenez quelque chose de nouveau tous les jours!
jchwebdev

Ce que vous pensez que vous faites, c'est "la sécurité à travers l'obscurité". Mais en réalité, vous ne faites que de l'obscurité, et c'est terrible. Ne l'utilise pas. L'auth est la sécurité. Cacher le point d'entrée est l'obscurité. security.stackexchange.com/questions/32064/…
Gaia

1
En d'autres termes, même SI vous changez l'emplacement de wp-login, vous devez toujours utiliser auth: "Dois-je compter sur le changement du serveur de 22 au port 2222 pour garder ma connexion sûre? Absolument pas. Est-il mauvais de changer mon Serveur SSH vers le port 2222 tout en utilisant un mot de passe? Non, si c'est la meilleure solution. Changer ("Obscurcir") le port réduira simplement un tas de scanners d'exploit automatiques recherchant les ports normaux. Nous obtenons un avantage de sécurité grâce à l'obscurité qui est bonne, mais nous ne comptons pas sur l'obscurité. S'ils l'ont trouvé, ils doivent encore déchiffrer le mot de passe. "
Gaia

Merci pour ça. J'ai beaucoup appris. Pas ce que je cherchais, mais quand même ... très utile. Meilleur --- JC
jchwebdev

0

Remplacez $pageidpar la page vers laquelle vous souhaitez rediriger les utilisateurs

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

Exemple ma page de connexion personnalisée. Enregistrer login.php et mettre du code

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

dans functions.php


Pourriez-vous modifier votre question et expliquer pourquoi cette réponse est meilleure que les réponses précédentes ou ce que vous faites exactement ce que vous faites. Les réponses codées uniquement sont généralement désapprouvées sans aucune sorte d'explication.
Howdy_McGee

ce code change wp-login.php en login.php avec mon code personnalisé basé sur bootstrap Il peut empêcher le bot automatique ou deviner l'url par défaut. utiliser peut changer <i> connexion </i> pour exprimer ce que vous voulez.et personne ne sait directement vous connecter.
Rei
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.