클라이언트로 부터 제공 받은 정보(입력)은 기본적으로 신뢰 할 수 없기 때문에 모든 값에 대해서 필히 검증을 해야 하기 때문에 웹 개발에서 상당 부분을 차지하고 있는건 Validate와 Sanitize라고 생각한다.
간혹, JS를 통해 클라이언트단에서 값검증을 하는 경우가 있는데 이는 UI적인 부분일뿐 유저로 받는 모든 값은 백단에서 필히 검증한 후 사용하여야 한다.
그런부분이 없다면 서버에 대한 통제권을 열어줄 뿐이다.
어떤 웹사이트에서든 진행하여야하고 개발자라면 누구나 하고 있을 이 지루하면서도 조금의 틈도 없이 처리해야할 작업을 위해 PHP에서 다양한 Filter를 제공하고 있다.
filter 함수에 다양한 옵션들을 줄 수 있고 Callback도 가능하기 때문에 이를 백분 활용한다면 많은 시간을 줄일 수 있다.
물론, PHP 프레임워크들을 사용할 경우 이를 활용한 많은 래퍼 함수들이 있으므로 그에 대해서도 충분히 살펴보는 것이 좋다.
<?php
if (array_key_existx('REMOTE_ADDR', $_SERVER)) {
filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP);
}
Array를 통해 한 번에 많은 변수 처리가 가능하다.
<?php
$data = array(
'product_id' => 'libgd<script>',
'component' => '10',
'versions' => '2.0.33',
'testscalar' => array('2', '23', '10', '12'),
'testarray' => '2',
);
$args = array(
'product_id' => FILTER_SANITIZE_ENCODED,
'component' => array('filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_FORCE_ARRAY,
'options' => array('min_range' => 1, 'max_range' => 10)
),
'versions' => FILTER_SANITIZE_ENCODED,
'doesnotexist' => FILTER_VALIDATE_INT,
'testscalar' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_SCALAR,
),
'testarray' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_FORCE_ARRAY,
)
);
$myinputs = filter_var_array($data, $args);
var_dump($myinputs);
echo "\n";
?>
result to:
array(6) {
["product_id"] => string(17) "libgd%3Cscript%3E"
["component"] => array(1) { [0] => int(10) }
["versions"] => string(6) "2.0.33"
["doesnotexist"] => NULL
["testscalar"] => bool(false)
["testarray"] => array(1) { [0] => int(2) }
}
특히 $_GET, $_ENV, $_POST, $_SESSION 등과 같은 변수들을 사용할 경우 직접 접근하여 사용하지 말고 filter_input()을 활용하면 좋다.
Type : INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV.
<?php
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "You have searched for $search_html.\n";
echo "<a href='?search=$search_url'>Search again.</a>";
?>
Example #1 result to:
You have searched for Me & son.
<a href='?search=Me%20%26%20son'>Search again.</a>
filter_has_var — Checks if variable of specified type exists
filter_id — Returns the filter ID belonging to a named filter
filter_input_array — Gets external variables and optionally filters them
filter_input — Gets a specific external variable by name and optionally filters it
filter_list — Returns a list of all supported filters
filter_var_array — Gets multiple variables and optionally filters them
filter_var — Filters a variable with a specified filter