브라우저로부터 데이터 가져오기(7)

minah moon·2023년 8월 14일

PHP

목록 보기
27/58
post-thumbnail

여러 입력을 검증하기 위한 필터

값을 동시에 수집하고 유효성을 검사하기 위해, filter_input_array()를 사용하고 수집한 각 데이터를 사용할 필터를 지정할 수 있다.

페이지가 여러 값을 수신해야 하는 경우, 페이지가 수신할 것으로 기대하는 각 값에 대한 요소로 연관 배열을 생성하자. 배열의 각 요소의 키는 폼 컨트롤의 이름 또는 쿼리 문자열의 이름이다.

각 요소에 대한 값은 다음 중 하나다.

  • 데이터가 수집될 때 사용할 필터의 이름(플래그 또는 옵션이 없는 경우)
  • 필터의 이름과 사용해야 하는 플래그 또는 옵션을 담는 배열
$filters['name1'] = FILTER_ID;
$filters['name2']['filter'] = FILTER_ID;
$filters['name2']['options']['option1'] = value1;
$filters['name2']['options']['option2'] = value2;

그런 다음, filter_input_array() 함수는 두 개의 매개변수와 함께 호출된다.

  • 입력 소스(INPUT_GET 또는 INPUT_POST)
  • 페이지가 각 입력에 대해 수신할 것으로 예상하는 값을 가지고 사용할 필터의 배열

이것은 새로운 연관 배열을 반환한다. 각 요소의 키는 입력 이름이며 값은 다음과 같다.

  • 제공된 값이 유효하다면 그 값
  • 값이 제공되었지만 유효하지 않다면 false
  • 이름이 제공되지 않았다면 null
$data = filter_input_array(INPUT_SOURCE, $filters);

페이지가 필터 배열에 지정되지 않은 추가 데이터를 수신하면 그 데이터는 filter_input_array()가 반환하는 배열에 추가되지 않는다.

데이터가 누락되었다면 null 값이 주어진다. 누락된 값이 배열에 추가되지 않도록 하려면 세 번째 인수로 false를 지정해야 한다.


변수를 가지고 동작하는 필터 함수

PHP에는 변수에 저장된 값을 필터링하는 두 가지 내장 필터 함수가 있다. filter_var()는 변수에 저장된 단일값에 필터를 적용한다. filter_var_array()는 배열에 저장된 값에 필터를 적용한다.

filter_var() 함수는 다음을 요구한다.

  • 확인할 값을 가지고 있는 변수의 이름
  • 필터 ID

옵션이나 플래그의 값을 filter_input()과 같은 방식으로 설정된다. 반환되는 값도 동일하다. 값이 유효하면 그 값을 반환하고, 유효하지 않다면 false를 반환한다. 누락되었다면 null이 반환된다.

filter_var($variable, FILTER_ID[, $settings]);

filter_var_array() 함수도 두 개의 매개변수를 갖는다.

  • 검사할 데이터를 가지고 있는 배열을 가진 변수의 이름
  • 필터 배열과 옵션/플래그

옵션이나 플래그에 대한 값을 filter_input_array()와 동일한 방식으로 설정되며 반환되는 값도 동일하다.

만약에 하나의 필터 이름만 지정되었다면 배열의 모든 값에 동일한 필터가 적용된다.

filter_var_array($array, $filters);

필터, 플래그, 그리고 옵션 검증

모든 유효성 검사 필터는 default라는 옵션도 갖는다. 이 옵션은 데이터가 유효하지 않을 경우 디폴트값을 제공하게 해준다.

FILTER_VALIDATE_BOOLEAN

값이 true(1, on, 또는 yes는 true로 처리됨)인지 검사한다. 값이 true면 true 불리언값을 반환하고, true가 아니면 false를, 이름이 없으면 null을 반환한다. 대소문자를 구분하지 않는다.

플래그

  • FILTER_NULL_ON_FAILURE : 유효하지 않다면 null을 반환한다.

FILTER_VALIDATE_INT

숫자가 정수(0은 유효한 정수로 간주되지 않음)인지 검사한다. 만약에 유효하다면 int 데이터 타입으로 수자를 반환한다.

플래그

  • FILTER_FLAG_ALLOW_HEX : 16진수를 허용한다.
  • FILTER_FLAG_ALLOW_OCTAL : 8진수를 허용한다.

옵션

  • min_range : 허용되는 최소 숫자
  • max_range : 허용되는 최대 숫자

FILTER_VALIDATE_FLOAT

숫자가 부동 소수점 숫자(10진수)인지 검사한다. 정수는 유효하다(0은 유효한 정수로 간주되지 않음). 만약에 유효하다면 float 데이터 타입으로 값을 반환한다.

플래그

  • FILTER_FLAG_ALLOW_THOUSAND : float는 천 단위 구분자를 갖게 한다. 유효하지 않은 경우 null을 반환한다.

FILTER_VALIDATE_REGEXP

문자열이 정규 표현식에 기술된 문자 패턴이 포함되어 있는지 검사한다.

옵션

  • regexp : 사용할 정규 표현식

FILTER_VALIDATE_EMAIL

문자열의 구조가 이메일 주소의 구조와 일치하는지 검사한다.

플래그

  • FILTER_FLAG_EMAIL_UNICODE : 주소의 이름 부분(@기호 앞 부분)에 유니코드 문자를 허용한다.

FILTER_VALIDATE_URL

문자열의 구조가 유효한 URL의 구조와 일치하는지 검사한다.

플래그

  • FILTER_FLAG_SCHEME_REQUIRED : 스키마를 포함해야 한다. 예를 들어,
    http:// 또는 ftp://
  • FILTER_FLAG_HOST_REQUIRED : 호스트 이름을 포함해야 한다.
  • FILTER_FLAG_PATH_REQUIRED : 파일 또는 디렉터리의 경로를 포함해야 한다.
  • FILTER_FLAG_QUERY_REQUIRED : 쿼리 문자열을 포함해야 한다.

FILTER_VALIDATE_DOMAIN

문자열의 구조가 도메인 이름의 구조와 일치하는지 검사한다.

플래그

  • FILTER_FLAG_HOSTNAME : 호스트 이름을 확인한다.

FILTER_VALIDATE_IP

문자열의 구조가 유효한 IP 주소의 구조와 일치하는지 검사한다.

플래그

  • FILTER_FLAG_IPV4 : 유효한 IPV4 IP 주소인지 검사한다.
  • FILTER_FLAG_IPV6 : 유효한 IPV6 IP 주소인지 검사한다.
  • FILTER_FLAG_NO_RES_RANGE : 예약된 범위의 IP를 허용하지 않는다. (로컬 네트워크에서 사용되며 인터넷을 통해 전송되지 않는 주소)
  • FILTER_FLAG_NO_PRIV_RANGE : 사설 IP를 허용하지 않는다(예약된 IP 주소의 하위 집합).

제거 필터

데이터 제거에는 값에 포함될 수 없는 문자를 제거하고 교체하는 작업(선택사항)이 포함된다. PHP의 네 가지 필터 함수는 내장 필터를 사용하여 데이터를 제거할 수 있다.

유효성 검사 필터 외에도 PHP의 내장 필터 함수는 값에 나타나지 말아야 할 문자를 제거(때로는 교체)하는 내장된 제거 필터sanitization filter를 사용할 수도 있다.

  • FILTER_SANITIZE_FULL_SPECIAL_CHARS : ENT_QUOTES가 켜진 htmlspecialchars()와 같다.
  • FILTER_SANITIZE_ENCODED : URL을 해당 URL의 URL 인코딩 버전으로 변환한다.
  • FILTER_SANITIZE_STRING : 문자열에서 태그를 제거한다.
  • FILTER_SANITIZE_NUMBER_INT : 0에서 9 그리고 + 또는 - 외의 문자를 제거한다.
  • FILTER_SANITIZE_NUMBER_FLOAT : 0에서 9 그리고 + 또는 - 외의 문자를 제거한다. 천 단위 및 소수를 구분하는 기호와 과학적 표기를 위한 e 또는 E를 허용하는 플래그를 갖는다.
  • FILTER_SANITIZE_EMAIL : 이메일 주소에 허용되지 않는 문자를 제거한다. A-z 0-9 ! # $ % & ' * + - = ? ^ _ ` { | } ~ @ . [ ] 를 허용한다.
  • FILTER_SANITIZE_URL : URL에 허용되지 않는 문자를 제거한다. A-z 0-9 $ - _ . + ! * ' ( ) , { } | \ ^ ~ [ ] ` < > # % " ; / ? : @ & = 을 허용한다.

데이터를 수집할 때가 아니라 사용할 때 데이터를 이스케이핑 처리하거나 불필요한 문자를 제거해야 한다.

또한 문자는 데이터가 사용되는 방식에 따라 다르게 이스케이핑된다. 이것을 데이터가 사용되는 방법의 컨텍스트context라고 한다.






출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022

0개의 댓글