
값을 동시에 수집하고 유효성을 검사하기 위해, 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() 함수는 두 개의 매개변수와 함께 호출된다.
이것은 새로운 연관 배열을 반환한다. 각 요소의 키는 입력 이름이며 값은 다음과 같다.
$data = filter_input_array(INPUT_SOURCE, $filters);
페이지가 필터 배열에 지정되지 않은 추가 데이터를 수신하면 그 데이터는 filter_input_array()가 반환하는 배열에 추가되지 않는다.
데이터가 누락되었다면 null 값이 주어진다. 누락된 값이 배열에 추가되지 않도록 하려면 세 번째 인수로 false를 지정해야 한다.
PHP에는 변수에 저장된 값을 필터링하는 두 가지 내장 필터 함수가 있다. filter_var()는 변수에 저장된 단일값에 필터를 적용한다. filter_var_array()는 배열에 저장된 값에 필터를 적용한다.
filter_var() 함수는 다음을 요구한다.
옵션이나 플래그의 값을 filter_input()과 같은 방식으로 설정된다. 반환되는 값도 동일하다. 값이 유효하면 그 값을 반환하고, 유효하지 않다면 false를 반환한다. 누락되었다면 null이 반환된다.
filter_var($variable, FILTER_ID[, $settings]);
filter_var_array() 함수도 두 개의 매개변수를 갖는다.
옵션이나 플래그에 대한 값을 filter_input_array()와 동일한 방식으로 설정되며 반환되는 값도 동일하다.
만약에 하나의 필터 이름만 지정되었다면 배열의 모든 값에 동일한 필터가 적용된다.
filter_var_array($array, $filters);
모든 유효성 검사 필터는 default라는 옵션도 갖는다. 이 옵션은 데이터가 유효하지 않을 경우 디폴트값을 제공하게 해준다.
값이 true(1, on, 또는 yes는 true로 처리됨)인지 검사한다. 값이 true면 true 불리언값을 반환하고, true가 아니면 false를, 이름이 없으면 null을 반환한다. 대소문자를 구분하지 않는다.
플래그
숫자가 정수(0은 유효한 정수로 간주되지 않음)인지 검사한다. 만약에 유효하다면 int 데이터 타입으로 수자를 반환한다.
플래그
옵션
숫자가 부동 소수점 숫자(10진수)인지 검사한다. 정수는 유효하다(0은 유효한 정수로 간주되지 않음). 만약에 유효하다면 float 데이터 타입으로 값을 반환한다.
플래그
문자열이 정규 표현식에 기술된 문자 패턴이 포함되어 있는지 검사한다.
옵션
문자열의 구조가 이메일 주소의 구조와 일치하는지 검사한다.
플래그
문자열의 구조가 유효한 URL의 구조와 일치하는지 검사한다.
플래그
문자열의 구조가 도메인 이름의 구조와 일치하는지 검사한다.
플래그
문자열의 구조가 유효한 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