diff --git a/modules/member/lang/en.php b/modules/member/lang/en.php index 24eceb38c..842043983 100644 --- a/modules/member/lang/en.php +++ b/modules/member/lang/en.php @@ -316,6 +316,7 @@ $lang->change_password_date = 'Password renewal cycle'; $lang->about_change_password_date = 'If you set a value to this, you will be notified to change your password periodically. (If set to 0, disabled)'; $lang->msg_change_password_date = 'You have not changed the password during %s days. For personal information protection, you need to change the password.'; $lang->about_login_trial_limit = 'Limit the number of login attempts in a short time from the same IP address.'; +$lang->about_login_failure_except_ip = 'You can specify IP addresses or ranges that are exempt from the login attempt limit.
Enter one IP address or range per line.'; $lang->msg_kr_address = 'Search for the name of eup, myeon or dong of your address.'; $lang->msg_kr_address_etc = 'Enter the rest of your address.'; $lang->cmd_search_again = 'Search again'; @@ -381,6 +382,7 @@ $lang->group = 'Group'; $lang->retrieve_password = 'Retrieve password'; $lang->excess_ip_access_count = 'There were too much login attempts from your device in a short time. You can not log in for %s.'; $lang->enable_login_fail_report = 'Login failure'; +$lang->login_failure_except_ip = 'Login failure except IP'; $lang->login_fail_report = 'Login failure report.'; $lang->login_fail_report_contents = '

There is recorded login failures.

%1$s

* This notification is shown once.
* This message contains login failure records, before a ID login success.
Sending: %2$s

'; $lang->all_group = 'Entire Group'; diff --git a/modules/member/lang/ko.php b/modules/member/lang/ko.php index dee729b3b..40b396bdb 100644 --- a/modules/member/lang/ko.php +++ b/modules/member/lang/ko.php @@ -319,7 +319,8 @@ $lang->msg_invalid_symbol_in_nickname = '닉네임에 사용할 수 없는 특 $lang->change_password_date = '비밀번호 갱신주기'; $lang->about_change_password_date = '일정 기간이 지나면 비밀번호를 변경하도록 유도하는 기능입니다. 사용하지 않으려면 0을 입력하십시오.'; $lang->msg_change_password_date = '%s일 동안 비밀번호를 변경하지 않았습니다. 개인정보 보호를 위하여 비밀번호를 변경해야 합니다.'; -$lang->about_login_trial_limit = '짧은 시간 동안 하나의 아이피(IP)에서 시도할 수 있는 로그인 횟수에 제한을 둡니다.'; +$lang->about_login_trial_limit = '짧은 시간 동안 하나의 IP에서 시도할 수 있는 로그인 횟수에 제한을 둡니다.'; +$lang->about_login_failure_except_ip = '로그인 횟수 제한에서 예외로 할 IP 주소 또는 대역을 지정할 수 있습니다.
IP 주소 또는 대역을 한 줄에 하나씩 입력하세요.'; $lang->msg_kr_address = '읍, 면, 동 이름으로 검색하세요.'; $lang->msg_kr_address_etc = '나머지 주소(번지)를 입력하세요.'; $lang->cmd_search_again = '다시 검색'; @@ -384,7 +385,8 @@ $lang->msg_success_modify_email_address = '이메일 주소가 정상적으로 $lang->group = '그룹'; $lang->retrieve_password = '비밀번호 찾기'; $lang->excess_ip_access_count = '로그인 가능 횟수를 초과했습니다. %s 간 로그인할 수 없습니다.'; -$lang->enable_login_fail_report = '계정 무한 대입 방지 사용'; +$lang->enable_login_fail_report = '계정 무한 대입 방지'; +$lang->login_failure_except_ip = '로그인 횟수 예외 IP'; $lang->login_fail_report = '로그인 실패 기록 보고 입니다.'; $lang->login_fail_report_contents = '

로그인 실패 기록을 알려드립니다.

%1$s

* 비밀번호를 틀리는 등의 일이 없었는데 이 메시지를 보신다면, 계정 관리에 유의 바랍니다.
* 이 메시지는 로그인이 성공한 순간 누적 로그인 실패 기록이 많을 경우, 로그인 성공 이전 실패 기록을 모아서 발송합니다.
발송 시각: %2$s

'; $lang->all_group = '그룹전체'; diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 17859439f..081f3c63b 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -596,6 +596,7 @@ class MemberAdminController extends Member 'enable_login_fail_report', 'max_error_count', 'max_error_count_time', + 'login_failure_except_ip', 'login_invalidate_other_sessions', 'after_login_url', 'after_logout_url' @@ -640,6 +641,14 @@ class MemberAdminController extends Member $args->change_password_date = 0; } + if($args->login_failure_except_ip) + { + $args->login_failure_except_ip = array_map('trim', explode("\n", $args->login_failure_except_ip)); + $args->login_failure_except_ip = array_filter($args->login_failure_except_ip, function($val) { + return $val !== ''; + }); + } + if(!trim(strip_tags($args->after_login_url))) { $args->after_login_url = NULL; diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 433adf649..356cf4cec 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -2642,20 +2642,21 @@ class MemberController extends Member $args = new stdClass; $args->ipaddress = \RX_CLIENT_IP; $output = executeQuery('member.getLoginCountByIp', $args); - $errorCount = $output->data->count; - if($errorCount >= $config->max_error_count) + if ($output->data->count >= $config->max_error_count) { - $last_update = strtotime($output->data->last_update); - $term = intval($_SERVER['REQUEST_TIME']-$last_update); - if($term < $config->max_error_count_time) + $last_update = ztime($output->data->last_update); + $term = intval(\RX_TIME - $last_update); + if ($term < $config->max_error_count_time) { - $term = $config->max_error_count_time - $term; - if($term < 60) $term = intval($term).lang('unit_sec'); - elseif(60 <= $term && $term < 3600) $term = intval($term/60).lang('unit_min'); - elseif(3600 <= $term && $term < 86400) $term = intval($term/3600).lang('unit_hour'); - else $term = intval($term/86400).lang('unit_day'); - - return new BaseObject(-1, sprintf(lang('excess_ip_access_count'), $term)); + if (!$config->login_failure_except_ip || !Rhymix\Framework\Filters\IpFilter::inRanges(\RX_CLIENT_IP, $config->login_failure_except_ip)) + { + $term = $config->max_error_count_time - $term; + if($term < 60) $term = intval($term).lang('unit_sec'); + elseif(60 <= $term && $term < 3600) $term = intval($term/60).lang('unit_min'); + elseif(3600 <= $term && $term < 86400) $term = intval($term/3600).lang('unit_hour'); + else $term = intval($term/86400).lang('unit_day'); + return new BaseObject(-1, sprintf(lang('excess_ip_access_count'), $term)); + } } else { diff --git a/modules/member/member.model.php b/modules/member/member.model.php index 2cdda377e..0a51d18ab 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -121,6 +121,7 @@ class MemberModel extends Member $config->enable_login_fail_report = $config->enable_login_fail_report ?? 'Y'; $config->max_error_count = $config->max_error_count ?? 10; $config->max_error_count_time = $config->max_error_count_time ?? 300; + $config->login_failure_except_ip = $config->login_failure_except_ip ?? []; $config->login_invalidate_other_sessions = $config->login_invalidate_other_sessions ?? 'N'; $config->after_login_url = $config->after_login_url ?? null; $config->after_logout_url = $config->after_logout_url ?? null; diff --git a/modules/member/tpl/login_config.html b/modules/member/tpl/login_config.html index e83bb4b68..236672a14 100644 --- a/modules/member/tpl/login_config.html +++ b/modules/member/tpl/login_config.html @@ -43,6 +43,13 @@

{$lang->about_login_trial_limit}

+
+ +
+ +

{$lang->about_login_failure_except_ip}

+
+