[5. 약한 문자열 강도]

Minseok Jo·2025년 12월 31일

웹 시큐어코딩

목록 보기
5/11
post-thumbnail

웹취약점 점검에서 개발한 웹에 대하여 점검을 진행하였고, 여러 취약점들을 발견하였다.
발견한 취약점들을 대상으로 시큐어 코딩을 진행하고자 한다.

이번 대상은 주요정보통신기반시설 분석·평가 가이드 12번 항목 - 약한 문자열 강도 이다.

약한문자열 강도 취약점이 발견된 항목은 다음과 같다.

  1. 회원가입

0. 약한 문자열 강도 대응방안

한국인터넷진흥원(KISA)의 「패스워드 선택 및 이용 안내서」에 따르면,
안전한 비밀번호는 영문 대소문자, 숫자, 특수문자 중 2종 이상을 조합한 8자 이상의 문자열이거나,
10자 이상의 충분히 긴 문자열로 구성해야 한다.


1. 시큐어 코딩

[1. 회원가입]

(기존)

// signup_proc.php
if (
    empty($_POST["input_id"]) ||
    empty($_POST["input_pw"]) ||
    empty($_POST["input_pw2"]) ||
    empty($_POST["input_name"])
) {
    echo "<script>
        alert('미입력된 정보가 있습니다');
        history.go(-1);
    </script>";
    exit;
}

if ($_POST["input_pw"] != $_POST["input_pw2"]) {
    echo "<script>
        alert('입력된 비밀번호가 일치하지 않습니다');
        history.go(-1);
    </script>";
    exit;
}

(수정 후)

$pw = $_POST["input_pw"];
$pw_pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_]).{8,}$/';

if (!preg_match($pw_pattern, $pw)) {
    echo "<script>
        alert('비밀번호는 특수문자, 대소문자를 포함한 8자 이상이어야 합니다');
        history.go(-1);
    </script>";
    exit;
}

① preg_match
preg_match() 함수는 문자열이 특정 정규표현식 패턴을 만족하는지 검사하는 PHP 함수이다.

preg_match(정규표현식, 검사할문자열);
반환값의미
1패턴과 일치
0패턴 불일치
false정규식 오류

② 패턴 구성

$pw_pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_]).{8,}$/';
부분의미
/../정규표현식 시작과 끝
^문자열 시작
(?=.*[a-z])소문자 1개 이상 포함
(?=.*[A-Z])대문자 1개 이상 포함
(?=.*[\W_])특수문자 1개 이상 포함
.{8,}8글자 이상
$문자열 끝

▷ 결과적으로, 대·소문자·특수문자를 포함하고 8자 이상인 문자열만 허용한다.


2. 보안 조치 결과

약한 문자열 강도
▲ 회원가입 시 입력하는 비밀번호에 대하여, 서버측에서 복잡도 준수 여부 검증


0개의 댓글