Задать вопрос
@defmin

Можно ли прикрутить нативную функцию?

private function clearVars(mixed $source): mixed
{
    if (is_array($source)) {

        foreach ($source as $key => $value) {
            $source[$key] = $this->clearVars($value);
        }
    }

    if (is_object($source)) {

        foreach ($source as $property => $value) {
            $source->{$property} = $this->clearVars($value);
        }
    }

    return is_string($source) ? htmlspecialchars($source) : $source;
}


Есть мнение, что всё это поделие можно заменить на array_walk_recursive.

Правильно ли такое мнение и если это так, то как это всё тогда будет выглядеть?

Я пробую, но получаю ошибку:

$array = [
    'a' => [
        'b' => '<script>alert("XSS")</script>'
    ]
]; // останется ли после array_walk_recursive структура 'a' => ['b' => '<script>alert("XSS")</script>']?

array_walk_recursive($array, 'htmlspecialchars'); //  htmlspecialchars(): Argument #2 ($flags) must be of type int, string given

var_dump($array);


И ещё вопрос: разве после array_walk_recursive сохранится структура массива (мне нужно сохранение структуры массива)?
  • Вопрос задан
  • 176 просмотров
Подписаться Простой Комментировать
Решения вопроса 1
smilingcheater
@smilingcheater
array_walk_recursive($array, fn (&$val) => $val = htmlspecialchars($val));

1. в callback-функцию передаётся 2 параметра (значение и ключ), но htmlspecialchars вторым параметром принимает флаги, а не ключи массива. Поэтому искусственно передаём только один.
2. array_walk сам по себе не меняет значения, поэтому передаёт значения по ссылке (&)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Можно, но не нужно.

Функция, которая пытается проискейпить все данные скопом сама по себе не нужна. Каждое значение надо форматировать отдельно.
И уж тем более функция, которая портит исходные данные. Представим, что одну и ту же информацию мы отправляем по емейлу, и в СМС. Сначала проискейпим HTML для шаблона письма, а потом эти же данные отправим в SMS... И там будут эти &quot;
И уж тем более функция, которой требуется доступ к свойству объекта на запись, который далеко не всегда есть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы