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