2017-12-21 10 views
0

Nachdem ich von einer langen Abwesenheit zu einem Skript zurückgekehrt bin, stecke ich an einer plötzlich fehlgeschlagenen Bereinigung.
Ich habe das Problem in einem Filter gefunden, der unerwartet false zurückgibt.PHP: was könnte dazu führen, dass FILTER_UNSAFE_RAW FALSE zurückgibt?

Hier ist ein Beispiel meiner unbeabsichtigten Ergebnisse zu replizieren:

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

Ich dachte, dass FILTER_UNSAFE_RAW soll nur die Eingabe zurückzukehren (ein Array in diesem Fall) unverändert.
Bin ich falsch in meinem Verständnis/Ansatz?

HINWEIS:
Mein Code hat streng selbstständig und als leichtgewichtige wie möglich sein, also eher als 3rd-Party-Bibliotheken/Klassen laden, ich schreibe in nur einfachen Funktionen Helfer, wo nötig.

Beispiel:

$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')) 
    { 
     ... 

Wie Sie sehen können, erfordert dieser Ansatz, dass bar sanitization geht, auch wenn keine desinfizierenden Maßnahmen erforderlich.

Bin ich Missverständnis FILTER_UNSAFE_RAW?

Antwort

0

Filter Flags Missing

Es sieht aus wie Sie die richtigen Flags für die sanitize Teil des filter_var_array

Jedes Mal, wenn Sie ein Array verarbeiten, müssen Sie die Flagge nicht hinzugefügt haben, gehören FILTER_REQUIRE_ARRAY

also ohne die Flagge, Sie waren immer die Antwort als false

Hinweis:FILTER_UNSAFE_RAW optional optional Streifen oder codiert Sonderzeichen. Dies ist auch der Standardfilter.

Beispiel

$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)); 

Ausgabe

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

) 

Edited Arbeits-Code

$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

Es gibt false zurück, da filter_var() Array nicht validieren kann. Und filter_var_array() ist wie filter_var() zu jedem Thema Array-Wert ausgeführt. Sie können versuchen, mit FILTER_UNSAFE_RAW als Filter und FILTER_REQUIRE_ARRAY als Flags innerhalb sanitize Array, Array als bar ‚s-Wert zu verwenden

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

Eine andere Sache zu beachten ist, da Sie nur FILTER_UNSAFE_RAW ohne Angabe Flags verwenden, es wird einfach nichts tun. Es ist also nicht dasselbe, es nicht zu desinfizieren. Es funktioniert zwar nicht in Ihrem Fall, weil es nicht an die Validierung übergeben wird.

Verwandte Themen