2017-12-21 53 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がちょうどそのまま入力(この場合は配列)を返すことになっていると思いました。
私は私の理解とアプローチに間違っていますか?

注:私のコードは厳密に自立となど軽量可能な限り、そうではなく、サードパーティのライブラリ/クラスをロードしなければなら
、私はちょうど書い-によ必要なシンプルなヘルパー関数。

例:

$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_RAWFILTER_REQUIRE_ARRAYあなただけそれだけで何もしないだろう、フラグを指定せずにFILTER_UNSAFE_RAWを使用するので注意するもう一つの事はある

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

フラグなどで、 sanitize配列内の barの値として配列を使用しようとすることができます。だからそれを消毒しないのは同じです。それは検証に渡されないため、あなたのケースでは動作しませんが。

関連する問題