WordPress:限制登录尝试(没有插件)

时间:2014-09-14 18:35:03

标签: php wordpress security login nginx

我正在寻找限制用户登录尝试的方法。我看到了this插件,但它已经超过2年没有更新了......如果可以的话,我总是喜欢一种不涉及插件的方式。 :)

是否可以在wp-config.php中设置变量?

否则,有没有办法通过网络服务器配置获得此功能?我有nginx 1.7.4。

4 个答案:

答案 0 :(得分:4)

我创办了这门课。

<?php
/**
* CLASS LIMIT LOGIN ATTEMPTS
* Prevent Mass WordPress Login Attacks by setting locking the system when login fail.
* To be added in functions.php or as an external file.
*/
if ( ! class_exists( 'Limit_Login_Attempts' ) ) {
class Limit_Login_Attempts {
    var $failed_login_limit = 3;                    //Giris Denemesi
    var $lockout_duration   = 1800;                 //Sureyi sn cinsinden giriniz. 30 dakika: 60*30 = 1800
    var $transient_name     = 'attempted_login';    //Transient used

    public function __construct() {
    add_filter( 'authenticate', array( $this, 'check_attempted_login' ), 30, 3 );
    add_action( 'wp_login_failed', array( $this, 'login_failed' ), 10, 1 );
    }

    /**
    * Lock login attempts of failed login limit is reached
    */
    public function check_attempted_login( $user, $username, $password ) {
        if ( get_transient( $this->transient_name ) ) {
            $datas = get_transient( $this->transient_name );
            if ( $datas['tried'] >= $this->failed_login_limit ) {
                $until = get_option( '_transient_timeout_' . $this->transient_name );
                $time = $this->when( $until );
                //Display error message to the user when limit is reached
                return new WP_Error( 'too_many_tried', sprintf( __( '<strong>HATA</strong>: Kimlik dogrulama sinirina ulastiniz, %1$s sonra lutfen tekrar deneyiniz.' ) , $time ) );
            }
        }
        return $user;
    }

    /**
    * Add transient
    */
    public function login_failed( $username ) {
        if ( get_transient( $this->transient_name ) ) {
            $datas = get_transient( $this->transient_name );
            $datas['tried']++;
        if ( $datas['tried'] <= $this->failed_login_limit )
            set_transient( $this->transient_name, $datas , $this->lockout_duration );
        } else {
            $datas = array(
            'tried'     => 1
        );
            set_transient( $this->transient_name, $datas , $this->lockout_duration );
        }
    }

    /**
    * Return difference between 2 given dates
    * @param  int      $time   Date as Unix timestamp
    * @return string           Return string
    */
    private function when( $time ) {
        if ( ! $time )
        return;
            $right_now = time();
            $diff = abs( $right_now - $time );
            $second = 1;
            $minute = $second * 60;
            $hour = $minute * 60;
            $day = $hour * 24;
        if ( $diff < $minute )
            return floor( $diff / $second ) . ' saniye';
        if ( $diff < $minute * 2 )
            return "yaklasik 1 dakika once";
        if ( $diff < $hour )
            return floor( $diff / $minute ) . ' dakika';
        if ( $diff < $hour * 2 )
            return 'yaklasik  1 saat once';
            return floor( $diff / $hour ) . ' saat';
    }
}
}
//Enable it:
new Limit_Login_Attempts();

答案 1 :(得分:3)

这篇文章相当陈旧我会提供我的发现,因为直到今天我才能找到答案。 看着codex和诸如此类的东西,但是到处都是我被命令使用插件 - 这是我不想要的。

所以回答你的问题:

  

是否有可以在wp-config.php中设置的变量?

不,你可以在wp-config中设置一个变量。

  

否则,有没有办法通过网络服务器配置获得此功能?我有nginx 1.7.4。

我不是网络服务器魔术师,但我猜不是。

但是! - 从blog post by Etienne Tremel我得到了一个过滤器:

add_filter( 'authenticate', (...)

和函数钩子:

add_action( 'wp_login_failed', (...)

您可以使用进入登录过程。通过这些信息,我能够通过自己的自定义代码预测登录尝试。

在他的博客文章中,您将找到要在您的functions.php文件中转储的复制粘贴代码段。

答案 2 :(得分:0)

最好的起点是下载并查看已经执行此操作的插件。无论插件是否是最新的,研究可以采用哪些方法都可以帮助您实现。

您可以查看以下更多选项:http://www.privacydusk.com/other-privacy/best-wordpress-plugins-to-limit-login-brute-force-attacks/

答案 3 :(得分:0)

保护此类功能确实最适合在此应用程序之外,甚至是它的编程语言。

拒绝连接通常是防火墙的任务,这也可以保护网络服务器。

将这两者放在一起,您很快就会到达fail2ban或sshguard。我与之合作的托管公司已经做到了这一点,所以我知道可以做到这一点。他们使用四次罢工并且你要制定政策。我不确定他们的代码是否公开,但是不应该很难提出一个配方,两者都有很好的文档。

相关问题