Я ищу способ ограничить попытки пользователя войти в систему. Я видел этот плагин, но он не обновлялся более 2 лет … и, если он доступен, я всегда предпочитаю способ, который не включает плагины 🙂
Есть ли переменная, которая может быть установлена в wp-config.php
?
Иначе, есть ли способ добиться этого через конфигурацию веб-сервера? У меня есть nginx 1.7.4.
Хотя пост довольно старый, я приведу свои выводы, потому что сам не смог найти ответ до сегодняшнего дня.
Посмотрел в кодексе и еще много чего, но везде мне приказали использовать плагин — чего я не хочу.
Итак, чтобы ответить на ваш вопрос:
Есть ли переменная, которая может быть установлена в wp-config.php?
Нет, переменная, которую вы можете установить в wp-config, отсутствует.
Иначе, есть ли способ добиться этого через конфигурацию веб-сервера? У меня есть nginx 1.7.4.
Я не волшебник веб-сервера, но думаю, что нет.
Но! — Из этого сообщение в блоге Этьена Тремеля Я понял, что есть фильтр:
add_filter( 'authenticate', (...)
и функция крючка:
add_action( 'wp_login_failed', (...)
Вы можете использовать, чтобы подключиться к процессу входа в систему. С этой информацией я смог предвидеть попытки входа в систему с помощью своего собственного кода.
В его блог-статье вы найдете фрагмент кода для вставки в файл functions.php.
Я основал этот класс.
<?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();
Лучше всего начать с загрузки и поиска плагина, который уже делает это. Изучение того, какие методы могут быть использованы, поможет вам в вашей реализации, независимо от того, обновлен плагин или нет.
Вот еще варианты, которые вы можете посмотреть: http://www.privacydusk.com/other-privacy/best-wordpress-plugins-to-limit-login-brute-force-attacks/
Защита такого рода функций действительно лучше всего делать вне этого приложения и даже на языке программирования.
Отказ в соединениях обычно является задачей брандмауэра, и это также защищает веб-сервер.
Соедините их вместе, и вы быстро достигнете fail2ban или sshguard. Хостинговая компания, с которой я работаю, сделала именно это, поэтому я знаю, что это возможно. Они используют четыре удара, и вы вне политики. Я не уверен, что их код общедоступен, но придумать рецепт не составит труда, у обоих отличная документация.