[PHP] 값 검증 : Validate와 Sanitize (Data Filtering)

Seo Joonsoo·2022년 6월 19일
0

php

목록 보기
4/23

클라이언트로 부터 제공 받은 정보(입력)은 기본적으로 신뢰 할 수 없기 때문에 모든 값에 대해서 필히 검증을 해야 하기 때문에 웹 개발에서 상당 부분을 차지하고 있는건 Validate와 Sanitize라고 생각한다.

간혹, JS를 통해 클라이언트단에서 값검증을 하는 경우가 있는데 이는 UI적인 부분일뿐 유저로 받는 모든 값은 백단에서 필히 검증한 후 사용하여야 한다.

그런부분이 없다면 서버에 대한 통제권을 열어줄 뿐이다.

어떤 웹사이트에서든 진행하여야하고 개발자라면 누구나 하고 있을 이 지루하면서도 조금의 틈도 없이 처리해야할 작업을 위해 PHP에서 다양한 Filter를 제공하고 있다.

filter 함수에 다양한 옵션들을 줄 수 있고 Callback도 가능하기 때문에 이를 백분 활용한다면 많은 시간을 줄일 수 있다.
물론, PHP 프레임워크들을 사용할 경우 이를 활용한 많은 래퍼 함수들이 있으므로 그에 대해서도 충분히 살펴보는 것이 좋다.

filter_var()

<?php
if (array_key_existx('REMOTE_ADDR', $_SERVER)) {
	filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP);
}

filter_var_array()

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.

Example #1

<?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 &#38; son.
<a href='?search=Me%20%26%20son'>Search again.</a>

http://docs.php.net/manual/en/ref.filter.php

Filter Functions

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

profile
여러분들 삶에 한 획을 더하고 싶습니다.

0개의 댓글