
웹취약점 점검에서 개발한 웹에 대하여 점검을 진행하였고, 여러 취약점들을 발견하였다.
발견한 취약점들을 대상으로 시큐어 코딩을 진행하고자 한다.
이번 대상은 주요정보통신기반시설 분석·평가 가이드 12번 항목 - 약한 문자열 강도 이다.
약한문자열 강도 취약점이 발견된 항목은 다음과 같다.
- 회원가입
한국인터넷진흥원(KISA)의 「패스워드 선택 및 이용 안내서」에 따르면,
안전한 비밀번호는 영문 대소문자, 숫자, 특수문자 중 2종 이상을 조합한 8자 이상의 문자열이거나,
10자 이상의 충분히 긴 문자열로 구성해야 한다.
(기존)
// 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자 이상인 문자열만 허용한다.
| 약한 문자열 강도 |
|---|
![]() |
| ▲ 회원가입 시 입력하는 비밀번호에 대하여, 서버측에서 복잡도 준수 여부 검증 |