WP-login.phpを無効にするかリダイレクトする


10

ログインしているかどうかにかかわらず、訪問者がアクセスできないようにする方法はありますmysite.com/wp-login.phpか?

私が必要としているのは別のログインフォームです。によって生成されwp-loginたフォームのスタイルを変更できることはわかっていますが、処理する必要はまったくありません。さまざまなフィルターとフックを試しましたが、リダイレクトできません。私も.htaccessリダイレクトを使用してみましたが、これは機能することがわかりましたが、その後、カスタムのログイン/ログアウトフォームが機能しなくなります。

アイデア?


セキュリティ上の理由からこれを行っていますか?wp-login.phpだけに認証を実装しないのはなぜですか?
ガイア

どういう意味かわかりません。少し拡大してください。TIA。
jchwebdev 2013年

なぜ別のログインフォームが必要なのですか?セキュリティ上の理由から?
ガイア

最近では、「wp-login」に気づいている人が多すぎます。それほど明白ではありません。「authを実装しない理由」の意味を教えていただけますか?TIA
jchwebdev 2013年

提供されている回答を参照してください。
ガイア

回答:


18

この質問を見つけ、いくつかの回答をテストした後、以下は私が運用環境で使用しているものの「クリーンアップ」バージョンです。

このバージョンでは、通知やエラーは発生せず、パスワードのリセットも機能します。

// 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-Login(良い)を妨げているようですが、最後のexit()は実際のlogin()が発生するのを妨げているようです。私たちは人々がログインできるようにしたいのですが、WP-Login画面を見ないでください。間違ったPWを入力すると、カスタムログインページにリダイレクトされます。
jchwebdev 14

編集して機能するようになりました:in_array()を実行する前に$ actionが入力されているかどうかを確認する必要があります
simonthesorcerer

これは私にはうまくいきませんでした。私はまだログインできます。
マイク

@マイク-あなたのフックがかかっている/働いていますか?echo "HERE";関数内に置くとどうなりますか?反響しますか?
random_user_name

1
@cale_bはい、フックは正常に動作しています。問題は、$_GET['action']私にとってそれが空であるということです。フォームはに投稿され/wp-login.php(URLにGET変数はありません)、ソースを見ると、という名前の入力さえないactionので、$_REQUEST['action']空です。
マイク

10

あなたのテーマのfunctions.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();
 }
}

私のために働いていますが、ログアウトの問題があり、その理由を理解できません
Androliyah 2012

7
wp-login.phpはログアウトも処理するためです。
Brian Fegter 2012

ええ、これは私のカスタムログインフォームをブロックします。しかし、リクエスト変数またはおそらくリファラーを確実にチェックする方法があったら?IOW:これが出発点になるかもしれません。他に誰か?TIA --- JC
jchwebdev 2012

はい、wp-loginはログアウトを処理します。笑。それは論理的です。おそらく、プラグイン付きのこのコードで十分でしょう。wp-loginを使用するのが嫌いなため、他に何が使用できるかを見てみましょう。
アンドロリヤ2012

私が必要だと思うのは、wp-loginがロードされたときにリクエスト変数を監視することだけでしょう。今はそれができるマシンがありません。
jchwebdev 2012

3

ログアウトアクションのGET変数を追加すると、正常に動作します。

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 14

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. すべてのWebサイト訪問者を新しいログインページにリダイレクトします。
  2. ログアウトは問題なく動作します
  3. カスタムログインページでは、カスタムログインフォーム、登録フォーム、パスワードリセットフォームを作成する必要がありますが、ポストリクエストはリダイレクトされないため、カスタムフォームはデータをwp-login.phpに安全にポストできます。

1
home_url()すでにスラッシュが追加されているので、その必要はありません。また$pagenow、(a)admin(およびおそらくログイン)にのみ存在するグローバルであり、(b)get_current_screen()プロパティチェックで置き換える必要があります。
カイザー2014年

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フォームではなく、/ loginにリダイレクトされます。


面白いアイデアですが、どのように/なぜ機能するのか説明してください
Mark Kaplun 2017年

これは機能しません。これは、login_url()を介してログインURLのリクエストをフィルタリングします。誰かが手動でwp-login.phpを入力することを妨げません。
Matt

0

wp-login.php見知らぬ人から見られることを防ぐことを意図している場合、最も簡単で効率的な方法は、へのアクセスに承認(基本認証)を要求することですwp-login.php

Apache、認証はhtaccessファイルとパスワードファイルの組み合わせによって実装されています。ブラウザーセッション内で初めて誰もがアクセスしようとするwp-login.phpと、ユーザー名とパスワードの入力を求められます(wordpressログインの前)。

簡単にするために、このユーザー名とパスワードはwp-login.php、最初の認証ダイアログボックスを正常に通過した後もワードプレスログインを入力する必要があるため、アクセスを許可するすべてのユーザーで同じにすることができます。


面白い。「プロンプト」は、資格情報を入力するためのブラウザのモーダルポップアップであると想定しています。それが混乱の原因になると思います。理想的には、私が欲しいのはそのURLが-何もしない-...またはおそらく単にホームページにリダイレクトすることです。しかしそれをありがとう。毎日新しいことを学びましょう!
jchwebdev 2013年

あなたがしていると思っているのは「あいまいさによるセキュリティ」です。しかし、実際にはあなたは曖昧なことしかやっておらず、それは恐ろしいことです。使用しないでください。認証はセキュリティです。入り口を隠すのは無名です。security.stackexchange.com/questions/32064/...
ガイア

1
つまり、wp-loginの場所を変更した場合でも、authを使用する必要があります。「接続を安全に保つために、サーバーを22からポート2222に変更することを信頼すべきですか?絶対にそうではありません。パスワードを使用しながらポート2222にSSHサーバーを接続しますか?いいえ、これが最善の解決策です。ポートを変更(「隠す」)すると、通常のポートを検索する自動エクスプロイトスキャナーのヒープが削減されます。あいまいさは良いですが、あいまいさに頼っていません。見つかった場合でも、パスワードを解読する必要があります。」
ガイア

それをありがとう。私は多くのことを学びました。探していたものではありませんが、それでも...とても役に立ちました。ベスト--- JC
jchwebdev 2013年

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に切り替えます。自動ボットを防止したり、デフォルトのURLを推測したりできます。を使用すると、<i> login </ i>を変更して目的のフレーズを表現できます。また、誰も直接ログインURLを知っているわけではありません。
Rei
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.