본문 바로가기
그누보드,영카트

그누보드5 로그인 5회 실패 차단 기능

by 씨엔아이소프트 2024. 9. 27.
반응형

login_check.php에 로그인 실패 시도를 5회 이상 했을 경우 1시간 동안 계정을 잠그는 기능을 추가

1. 로그인 시도 기록 테이블 추가

로그인 시도 횟수를 기록할 별도의 테이블을 생성합니다.

CREATE TABLE `g5_login_attempts` (
    `user_id` VARCHAR(255) NOT NULL,
    `attempts` INT(11) NOT NULL DEFAULT 0,
    `last_attempt` DATETIME NOT NULL,
    PRIMARY KEY (`user_id`)
);
2. login_check.php 수정
<?php
include_once('./_common.php');

$g5['title'] = "로그인 검사";

$mb_id       = isset($_POST['mb_id']) ? trim($_POST['mb_id']) : '';
$mb_password = isset($_POST['mb_password']) ? trim($_POST['mb_password']) : '';

run_event('member_login_check_before', $mb_id);

if (!$mb_id || run_replace('check_empty_member_login_password', !$mb_password, $mb_id))
    alert('회원아이디나 비밀번호가 공백이면 안됩니다.');

// 로그인 시도 기록 체크
$current_time = date('Y-m-d H:i:s');
$attempt_query = "SELECT * FROM g5_login_attempts WHERE user_id = '$mb_id'";
$attempt_result = sql_fetch($attempt_query);

if ($attempt_result) {
    $last_attempt_time = strtotime($attempt_result['last_attempt']);
    $current_time_time = strtotime($current_time);

    // 실패 횟수 5회 이상이고 1시간이 지나지 않았다면 로그인 차단
    if ($attempt_result['attempts'] >= 5 && ($current_time_time - $last_attempt_time) < 3600) {
        alert('로그인 실패가 5회 이상 발생했습니다. 1시간 후에 다시 시도해주세요.');
        exit;
    }
    // 실패 횟수 초기화
    elseif ($attempt_result['attempts'] >= 5 && ($current_time_time - $last_attempt_time) > 3600) {
        $reset_attempts_query = "UPDATE g5_login_attempts SET attempts = 0, last_attempt = '$current_time' WHERE user_id = '$mb_id'";
        sql_query($reset_attempts_query);
    }
} else {
    // 첫 로그인 실패 시도 처리
    $insert_attempt_query = "INSERT INTO g5_login_attempts (user_id, attempts, last_attempt) VALUES ('$mb_id', 1, '$current_time')";
    sql_query($insert_attempt_query);
}

// 기존의 회원 정보를 가져옴
$mb = get_member($mb_id);

// 비밀번호 검증 실패 시도 증가 로직
if (! (isset($mb['mb_id']) && $mb['mb_id']) || !login_password_check($mb, $mb_password, $mb['mb_password'])) {
    if ($attempt_result) {
        $update_attempts_query = "UPDATE g5_login_attempts SET attempts = attempts + 1, last_attempt = '$current_time' WHERE user_id = '$mb_id'";
        sql_query($update_attempts_query);
    } else {
        $insert_attempt_query = "INSERT INTO g5_login_attempts (user_id, attempts, last_attempt) VALUES ('$mb_id', 1, '$current_time')";
        sql_query($insert_attempt_query);
    }

    alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}

// 로그인 성공 시 실패 기록 초기화
$delete_attempts_query = "DELETE FROM g5_login_attempts WHERE user_id = '$mb_id'";
sql_query($delete_attempts_query);

// 기존의 로그인 성공 처리 로직 유지

goto_url($link);
반응형

댓글