PHP 입력값 유효성 검사 및 타입 검증 가이드
페이지 정보

본문
그누보드 기능을 적용하거나 코드를 수정할 때 필요한 PHP 입력값 유효성 검사 방법과 is_int 함수 오작동 문제 해결에 도움을 줍니다.
is_int 함수를 사용자 입력값에 사용할 때 오작동하는 이유
폼(POST) 요청을 통해 전송되는 모든 입력값은 PHP에서 기본적으로 문자열(string) 타입으로 처리됩니다. is_int() 함수는 변수의 데이터 타입이 정수(integer)인지 엄격하게 판별하므로, 숫자 형태의 문자열(예: '1')을 전달하면 타입 불일치로 인해 false를 반환합니다. 이는 PHP 4.4.7부터 최신 버전까지 동일하게 적용되는 동작 방식입니다.
예를 들어 숫자 1을 폼으로 전송한 뒤 is_int($_POST['my_var']) 형태로 확인하면 정수가 아닌 문자열로 인식되어 오작동이 발생합니다. 반면 코드 내에서 직접 선언한 정수형 리터럴(예: is_int(111))에 사용하면 정상적으로 true가 반환됩니다.
안전한 입력값 검증 대안
is_numeric()또는filter_var()함수를 사용하거나, 변수를 정수형으로 강제 변환(intval())하여 검증해야 합니다.
PHP 입력값 정수 검증 및 변환 방법
PHP 환경에서 사용자 입력값이 숫자인지 안전하게 검증하고 정수형으로 변환하려면 preg_match 정규식 검사나 intval 함수를 조합하여 활용할 수 있습니다.
1. preg_match를 활용한 숫자 패턴 검사
정규 표현식을 이용해 입력값이 지정된 자릿수의 숫자로만 구성되어 있는지 확인할 수 있습니다. 예를 들어 3자리 이상 15자리 이하의 숫자만 허용하려면 다음과 같이 검사합니다.
if ( preg_match("/^([0-9]*){3,15}$/", $_POST['aaa']) ) {
echo "this is a integer 정수입니다.";
} else {
echo "this is a string 문자입니다";
}
2. intval을 활용한 정수 변환 및 검증
intval 함수를 사용하면 입력값을 정수형으로 변환할 수 있으며, 이를 원래 값과 비교하거나 조건식에 활용하여 검증할 수 있습니다.
- 입력값이 비어있지 않고 정수 형태인지 비교할 때:
if($_POST["tel1"] == intval($_POST["tel1"])) {
echo "$_POST["tel1"] is an integer";
}
- 값이 0보다 큰 정수인지 확인할 때:
if(intval($_POST["tel1"]) > 0) {
// 처리 로직
}
3. 주의사항
is_int함수는 변수 자체의 내부 데이터 타입을 판별하므로, HTML 폼 등을 통해 문자열 형태로 전달된$_POST값에 직접 사용할 경우 숫자로 이루어져 있어도 문자열로 취급되어false를 반환할 수 있으니 주의해야 합니다.
PHP에서 주민등록번호나 날짜 데이터의 유효성을 검증할 때는 정규식(preg_match)을 이용한 형식 검사와 내장 함수인 checkdate()를 조합하여 처리하는 것이 일반적입니다.
주민등록번호 유효성 검사 로직
주민등록번호는 13자리 숫자로 구성되며, 특정 규칙(생년월일, 성별, 체크섬)을 따릅니다. 서버 사이드에서 검증하는 절차는 다음과 같습니다.
- 형식 검사: 정규식을 사용하여 13자리 숫자인지, 7번째 자리가 1~4 사이의 값인지 확인합니다.
- 날짜 유효성 검사: 주민등록번호 앞 6자리에서 연·월·일 정보를 추출한 뒤,
checkdate($month, $day, $year)함수를 사용하여 실제로 존재하는 날짜인지 검증합니다. - 체크섬 검증: 주민등록번호 마지막 자리가 공식에 의해 계산된 값과 일치하는지 확인합니다.
주요 함수 활용
checkdate($month, $day, $year): 전달된 월, 일, 연도가 유효한 날짜인지 확인하여true또는false를 반환합니다.preg_match($pattern, $subject): 정규 표현식을 사용하여 입력값이 주민등록번호 형식(예:^[0-9]{6}[1-4][0-9]{6}$)에 부합하는지 검사합니다.
※ 주의: 과거에 사용되던 ereg() 함수는 PHP 5.3.0부터 폐기(deprecated)되었고 PHP 7.0.0에서 완전히 삭제되었습니다. 현재 모든 PHP 환경에서는 반드시 preg_match()를 사용해야 합니다.
상황별 입력값 검증 및 선택 기준
| 내 상황 | 우선할 판단 | 다음 행동 |
|---|---|---|
폼(POST)으로 전송된 숫자 데이터를 is_int()로 검증 중 오작동 발생 | is_int() 함수는 문자열 입력을 false로 처리하므로 즉시 중단 | preg_match 정규식 패턴 검사나 intval() 또는 is_numeric() 함수로 대체 적용 |
| 주민등록번호 등 복합 포맷의 데이터 검증 필요 | 문자열 형태 검사와 실제 존재 여부(날짜 등)를 분리하여 검증 | preg_match로 13자리 숫자 형식을 확인한 후 checkdate() 함수로 날짜 유효성 검증 수행 |
실전 FAQ
Q. is_int() 함수를 사용자 입력값($_POST)에 직접 사용하면 왜 문제가 되나요?
- 예외 및 대안: 폼을 통해 전달되는 모든 입력값은 기본적으로 문자열(string) 타입으로 취급됩니다. 따라서 값이 숫자 형태여도
is_int()는 타입 불일치로 인해false를 반환하므로, 숫자 여부를 확인할 때는is_numeric()이나 정수 변환 함수인intval()을 사용해야 합니다.
Q. 주민등록번호 유효성을 서버 사이드에서 검증할 때 주의할 점은 무엇인가요?
- 실행 및 예외: 과거에 쓰이던
ereg()함수는 현재 PHP 버전에서 지원이 중단되었으므로 반드시preg_match()함수를 사용해 13자리 형식과 7번째 자리(성별 구분 값)를 검사해야 합니다. 또한 추출한 생년월일은checkdate()를 통해 실제 존재하는 달력 날짜인지 함께 확인해야 합니다.
함께 보면 좋은 글
참고자료
기타 참고자료
- 이전글PHP addslashes() 함수를 이용한 작은따옴표 데이터 삽입 및 SQL 이스케이프 처리 26.09.30
- 다음글ASP Left/Right 함수를 PHP substr로 구현하는 방법 26.09.30
댓글목록
등록된 댓글이 없습니다.