BOARD

자료·레퍼런스

PHP 입력값 유효성 검사 및 타입 검증 가이드

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 16회 작성일 26-09-30 17:45

본문

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자리 숫자로 구성되며, 특정 규칙(생년월일, 성별, 체크섬)을 따릅니다. 서버 사이드에서 검증하는 절차는 다음과 같습니다.

  1. 형식 검사: 정규식을 사용하여 13자리 숫자인지, 7번째 자리가 1~4 사이의 값인지 확인합니다.
  2. 날짜 유효성 검사: 주민등록번호 앞 6자리에서 연·월·일 정보를 추출한 뒤, checkdate($month, $day, $year) 함수를 사용하여 실제로 존재하는 날짜인지 검증합니다.
  3. 체크섬 검증: 주민등록번호 마지막 자리가 공식에 의해 계산된 값과 일치하는지 확인합니다.

주요 함수 활용

  • 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()를 통해 실제 존재하는 달력 날짜인지 함께 확인해야 합니다.

함께 보면 좋은 글

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.