我正在寻找限制用户登录尝试的方法。我看到了this插件,但它已经超过2年没有更新了......如果可以的话,我总是喜欢一种不涉及插件的方式。 :)
是否可以在wp-config.php
中设置变量?
否则,有没有办法通过网络服务器配置获得此功能?我有nginx 1.7.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。我与之合作的托管公司已经做到了这一点,所以我知道可以做到这一点。他们使用四次罢工并且你要制定政策。我不确定他们的代码是否公开,但是不应该很难提出一个配方,两者都有很好的文档。