안경잡이개발자

728x90
반응형

※ 취약점 설명 및 고려사항 ※


  로그인 기능을 포함해 다양한 주요 인증 기능을 구현할 때에는 인증 시도 횟수를 제한해야 합니다. 주요기관의 소프트웨어 개발보안 가이드를 보면 로그인 시도 횟수를 3~5번 이내로 제한하고 이를 초과하여 로그인에 실패하는 경우 추가 입력값을 요구하거나 계정잠금을 수행하도록 설계해야 한다고 나옵니다.


※ 적용 예시 ※


  현재 SMS 인증 API의 데이터베이스 컬럼은 다음과 같이 구성되어 있습니다.


- member_tel: 핸드폰 번호

- sms_token: 인증 번호

- sms_date: 인증 시도 날짜


  가장 간단한 구현 방법은 [최근 10분 이내에 3회 이상 요청한 핸드폰 번호인지 체크]하여 10분 이내에 3회 이상 요청을 했다면 잠금 처리를 할 수 있도록 하는 것입니다. 따라서 다음과 같은 SQL 구문을 이용하면 좋습니다. (MySQL 기준)


SELECT COUNT(*) as cnt

FROM {SMS 인증 테이블}

WHERE sms_date > date_sub(now(), interval 600 second)

AND member_tel = {핸드폰 번호};


  위 소스코드를 이용하면 최근 10분 이내에 SMS 인증 요청이 몇 번 발생했는지 확인할 수 있습니다. 그래서 컨트롤러(Controller)에서는 다음과 같은 형태로 처리할 수 있습니다. (PHP, REST API 기준)


$member_tel = $this->input_check('member_tel');

$result = $this->model_member->check_sms_repeat($member_tel );

if($result >= 3) {

$this->output->set_status_header(503); // 최근 10분 이내에 3회 이상 요청하여 잠금 처리 된 핸드폰 번호입니다.

exit;

}




728x90
반응형