очистка — PHP: что может заставить FILTER_UNSAFE_RAW возвращать FALSE?

Вернувшись к сценарию после долгого отсутствия, я застрял на внезапно провалившейся дезинфекции.
Я обнаружил проблему в фильтре, неожиданно возвращающемся 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?

1

Решение

Похоже, вы не добавили правильные флаги для санитарной части filter_var_array

Всякий раз, когда вы обрабатываете массив, вы должны включить флаг FILTER_REQUIRE_ARRAY

Следовательно, без флага вы получали ответ как false

Замечания: FILTER_UNSAFE_RAW просто опционально удаляет или кодирует специальные символы. Также это фильтр по умолчанию.

пример

$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() не может проверить массив. А также filter_var_array() это как бег filter_var() к значению каждого предметного массива. Вы можете попробовать использовать массив как barценность внутри sanitize массив, с FILTER_UNSAFE_RAW в качестве фильтра и FILTER_REQUIRE_ARRAY как флаги

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

Еще одна вещь, которую стоит отметить, так как вы используете только FILTER_UNSAFE_RAW без указания флагов он просто ничего не сделает. Так что не дезинфекция это то же самое. Хотя он не будет работать в вашем случае, потому что он не будет передан для проверки.

1

По вопросам рекламы [email protected]