PHP에서의 입력 필터링 마스터하기: `filter_input` 기법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- PHP 개발자 (초보자 및 중급자)
- 보안 및 입력 검증에 관심 있는 개발자
- 웹 애플리케이션 개발을 진행 중인 프로젝트 팀
- 난이도: 중간 (기본 문법 이해 필요, 보안 개념 기본 지식 권장)
핵심 요약
filter_input
함수는$_GET
,$_POST
,$_COOKIE
등의 외부 변수를 필터링 및 검증하는 데 사용되며, SQL 인젝션, XSS 등의 보안 취약점을 방지.- 필수 파라미터:
$type
(예:INPUT_POST
),$variable_name
,$filter
(예:FILTER_VALIDATE_EMAIL
),$options
(예:min_range
,max_range
).- 주의 사항:
FILTER_SANITIZE_STRING
은 PHP 8.1에서 비활성화되어htmlspecialchars
등의 대체 방법 사용 권장.
섹션별 세부 요약
1. `filter_input` 기본 개념 및 사용법
filter_input
은 외부 입력값을 자동으로 검증하고 청소하는 PHP 내장 함수.- 예:
filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)
로 이메일 형식 검증. - 필터 종류:
FILTER_VALIDATE_EMAIL
,FILTER_VALIDATE_INT
,FILTER_VALIDATE_URL
등.
2. 입력값 청소 및 검증 예시
- 이메일 검증:
```php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) { echo "Invalid email!"; }
```
- 문자열 청소:
```php
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
```
- 숫자 검증:
```php
$age = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT);
if ($age === false || $age < 1) { echo "Invalid age!"; }
```
3. 범위 제한 및 배열 입력 처리
- 범위 제한:
```php
$score = filter_input(INPUT_POST, 'score', FILTER_VALIDATE_INT, ["options" => ["min_range" => 0, "max_range" => 100]]);
```
- 배열 입력 처리:
```php
$filters = [
'emails' => ['filter' => FILTER_VALIDATE_EMAIL, 'flags' => FILTER_REQUIRE_ARRAY]
];
$sanitized = filter_input_array(INPUT_POST, $filters);
```
4. `filter_input`의 장단점
- 장점:
- 내장 함수이므로 직접 검증 로직 작성 필요 없음.
- 보안 취약점 방지에 효율적.
- 단점:
FILTER_SANITIZE_STRING
등 일부 필터가 비활성화됨.- 고도화된 검증은 커스텀 라이브러리(예: Laravel Validator) 사용 권장.
5. 고급 검증을 위한 대체 라이브러리
- Laravel Validator 또는 Symfony Validator Component 사용 시:
- 복잡한 규칙 정의 가능.
- 보안 및 유효성 검증의 유연성 확보.
결론
filter_input
은 간단한 입력 검증 및 청소에 적합하지만, 복잡한 검증은 Laravel Validator 등 라이브러리 사용 권장.- PHP 8.1 이상에서는
FILTER_SANITIZE_STRING
대신htmlspecialchars
또는filter_var
과FILTER_SANITIZE_FULL_SPECIAL_CHARS
사용. - 보안 중심 개발을 위해 필터링 로직은 모든 사용자 입력에 적용해야 함.