禁用或重定向WP-login.php


10

有没有一种方法可以阻止访客(无论是否已登录)到达mysite.com/wp-login.php

我有一个单独的登录表单,这是我们所需要的。我知道我可以重新设置生成的表单的样式,wp-login但我根本不必处理它。我尝试了各种过滤器和挂钩,但似乎无法重定向到它。我也尝试过使用.htaccess重定向,但我发现这可行,但是随后它阻止了我的自定义登录/注销表单。

有想法吗?


您出于安全原因这样做吗?为什么不仅对wp-login.php实现auth?
盖亚

我不知道你是什么意思。请扩大一点。TIA。
jchwebdev

为什么需要单独的登录表单?出于安全原因?
盖亚

我们发现,如今有太多人知道​​“ wp登录”。我们宁愿不要这么明显。您能告诉我“为什么不实施身份验证”是什么意思吗?TIA
jchwebdev

请参阅提供的答案。
盖亚

Answers:


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-Login(良好),但是最终的exit()似乎阻止了实际的login()发生,而这并不是我们想要的。我们希望人们能够登录,而永远不会看到WP-Login屏幕。如果他们输入的密码不正确,则应重定向到我们的自定义登录页面。
jchwebdev

编辑它,它现在正在工作:您必须在执行in_array()之前检查$ action是否已填充
simonthesorcerer 2014年

这对我不起作用。我仍然可以登录
Mike

@Mike-您确定钩子正在/正在工作吗?如果将echo "HERE";函数放入函数内部会怎样?它会回声吗?
random_user_name 2015年

1
@cale_b是的,该钩子工作正常。问题是那$_GET['action']对我来说是空的。表单被发布到/wp-login.php(URL中没有任何GET变量),并查看源,甚至没有名为in的输入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

是的,这阻止了我的自定义登录表单。但是,是否有一种方法可以可靠地检查请求var或引用程序?IOW:这可能是一个起点。还有谁?TIA --- JC
jchwebdev

是的,wp-login确实处理注销。大声笑。那是合乎逻辑的。带有插件的这段代码也许就足够了。让我看看我们还能使用什么,因为我讨厌使用wp-login。
Androliyah 2012年

我认为所需要的只是在加载wp-login时监视请求vars。我只是没有一台可以立即执行此操作的机器。
jchwebdev 2012年

3

为注销操作添加一个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插件Rename 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()属性检查代替。
kaiser 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);
}

这将重定向到/ login,而不是讨厌的wp-login形式。


hmmm有趣的主意,但请解释一下它的工作原理/原因
Mark Kaplun

这是行不通的。这将通过login_url()过滤对登录URL的请求,但不会阻止某人手动键入wp-login.php。
马特

0

如果您的目的是保护自己wp-login.php甚至不被陌生人看到,那么最简单有效的方法是要求访问权限(基本身份验证)wp-login.php

Apache中,auth通过htaccess和密码文件的组合来实现。在浏览器会话中,第一次有人尝试访问wp-login.php他们时,系统会提示您输入用户名和密码(在wordpress登录之前)。

为简化起见,您要授予访问权限的每个人的用户名和密码都可以相同wp-login.php,因为成功通过第一个auth对话框后,他们仍然必须输入其wordpress登录名。


有趣。我假设“提示”是浏览器用于输入凭据的模式弹出窗口。我认为那会引起混乱。理想情况下,我想要的是该URL不执行任何操作,或者只是重定向到主页。但是,谢谢你。每天学些新东西!
jchwebdev

您认为您正在做的是“通过模糊实现安全”。但是实际上,您只是默默无闻,这太可怕了。不要使用它。身份验证是安全的。隐藏入口点是模糊的。security.stackexchange.com/questions/32064/…–
盖亚

1
换句话说,即使您更改了wp-login的位置,您仍然需要使用auth:“我是否应该依靠将服务器从22更改为端口2222来保持我的连接安全?绝对不是。更改我的身份是否不好? SSH服务器到端口2222的同时还使用密码吗?否,如果这是最好的解决方案,更改(“遮盖”)端口将只会减少搜索正常端口的自动漏洞利用扫描程序的堆。默默无闻,这很好,但是我们不指望默默无闻。如果他们发现默默无闻,他们仍然需要破解密码。”
盖亚

感谢那。我学到了很多。不是我要找的东西,但仍然...非常有帮助。最佳
-JC

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,它可以防止自动bot或猜测默认url。使用可以将<i>登录</ i>更改为您想要的短语。没有人知道直接登录网址可以摘录您。
Rei
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.