2017-12-21 6 views
0

오래간만에 대본을 읽은 후 갑자기 실패한 위생 처리에 막혔습니다.
예기치 않게 false을 반환하는 필터에서 문제가 발견되었습니다.PHP : FILTER_UNSAFE_RAW가 FALSE를 반환 할 수있는 원인은 무엇입니까?

은 여기 내 의도하지 않은 결과를 복제하는 예입니다 :

$test = [ 'apple', 'bananna', 'orange', 'lime', 'grape', ]; 
var_export(filter_var($test, FILTER_UNSAFE_RAW)); // false 

나는 FILTER_UNSAFE_RAW 단지 변경 입력 (이 경우 배열)을 반환하도록되어 있다고 생각했다.
내 이해/접근에 잘못 되었나요?

참고 :
내 코드가 엄격하게 자립하고 경량 가능한 한, 그래서보다는 필요한 경우 간단한 헬퍼 함수에 쓰기 - 제 3의 라이브러리/클래스, 난 그냥있어로드되어야합니다.

예 : 당신이 볼 수 있듯이

$filters = [ 
    'sanitize' => [ 
     'foo' => FILTER_SANITIZE_EMAIL, 
     'bar' => FILTER_UNSAFE_RAW, 
    ], 
    'validate' => [ 
     'foo' => FILTER_VALIDATE_EMAIL, 
     'bar' => [ 
      'filter' => FILTER_VALIDATE_REGEXP, 
      'flags' => FILTER_REQUIRE_ARRAY, 
      'options' => [ 'regexp' => '/(apple|grape)/' ], 
     ], 
    ], 
]; 

$test = [ 
    'malicious' => 'something bad', 
    'foo' => '[email protected]', 
    'bar' => [ 'apple', 'grape', 'orange', ], 
]; 

// validate 
$checked = sanitizeInput($filters, $test); 

// sanitizer 
function sanitizeInput($f, $input) 
{ 
    // sanitize 
    $sanitized = filter_var_array($input, $f['sanitize']) 

    // validate 
    $validated = filter_var_array($sanitized, $f['validate']); 

    // if anything appears to have failed validation (was set to FALSE) 
    if(FALSE !== strpos(json_encode($validated), 'false')) 
    { 
     ... 

,이 방법은 bar 더 살균 조치가 필요하지 않습니다에도 불구하고, 위생을 통과해야합니다.

오해 나는 FILTER_UNSAFE_RAW입니까?

답변

0

필터 플래그는 배열을 처리 할 때마다 당신이 filter_var_array

의 살균 부분에 대한 적절한 플래그를 추가하지 않은 것 같습니다

누락되어, 당신은 플래그 FILTER_REQUIRE_ARRAY

을 포함해야:

따라서 플래그없이, 당신은 false

참고로 반응을 얻고 있었다은 선택적으로 특수 문자를 제거하거나 인코딩합니다. 또한 이것이 기본 필터입니다.

$test['bar'] = array('apple', 'bananna', 'orange', 'lime', 'grape'); 

$san['bar'] = [ 
    'filter' => FILTER_UNSAFE_RAW, 
    'flags' => FILTER_REQUIRE_ARRAY 
]; 

print_r(filter_var_array($test, $san)); 

출력

Array 
(
    [bar] => Array 
     (
      [0] => apple 
      [1] => bananna 
      [2] => orange 
      [3] => lime 
      [4] => grape 
     ) 

) 

편집 작업 코드

$filters = [ 
    'sanitize' => [ 
     'foo' => FILTER_SANITIZE_EMAIL, 
     'bar' => [ 
      'filter' => FILTER_UNSAFE_RAW, 
      'flags' => FILTER_REQUIRE_ARRAY 
     ], 
    ], 
    'validate' => [ 
     'foo' => FILTER_VALIDATE_EMAIL, 
     'bar' => [ 
      'filter' => FILTER_VALIDATE_REGEXP, 
      'flags' => FILTER_REQUIRE_ARRAY, 
      'options' => [ 'regexp' => '/(apple|grape)/' ], 
     ], 
    ], 
]; 

$test = [ 
    'malicious' => 'something bad', 
    'foo' => '[email protected]', 
    'bar' => [ 'apple', 'grape', 'orange', ], 
]; 

// validate 
$checked = sanitizeInput($filters, $test); 

// sanitizer 
function sanitizeInput($f, $input) { 

    // sanitize 
    $sanitized = filter_var_array($input, $f['sanitize']); 

print_r($sanitized); 

    // validate 
    $validated = filter_var_array($sanitized, $f['validate']); 

    // if anything appears to have failed validation (was set to FALSE) 
    if(FALSE !== strpos(json_encode($validated), 'false')) {} 

    return $validated; 
} 
1

filter_var()은 배열의 유효성을 검사 할 수 없으므로 false를 반환합니다. filter_var_array()은 각 주제 배열의 값에 filter_var()을 실행하는 것과 같습니다. 당신은 그냥 아무것도하지 않는 것, 당신은 단지 지정 플래그없이 FILTER_UNSAFE_RAW을 사용하기 때문에

'sanitize' => [ 
    'foo' => FILTER_SANITIZE_EMAIL, 
    'bar' => [ 
      'filter' => FILTER_UNSAFE_RAW, 
      'flags' => FILTER_REQUIRE_ARRAY 
      ], 
], 

주목해야 할 또 다른 한가지는 플래그로 필터로 FILTER_UNSAFE_RAWFILTER_REQUIRE_ARRAY으로, sanitize 배열 내부 bar의 값으로 배열을 사용하려고 할 수 있습니다. 그래서 위생 처리하지 않는 것은 똑같습니다. 유효성 검사에 전달되지 않기 때문에 귀하의 경우에는 작동하지 않지만.

관련 문제