Рекурсия в PHP
Что-то такое рекурсия, многие из Вас знают. Но, на всякий случай, рекурсия - это вызов функции внутри самой себя. Однако, это определение все знают, но вот с пониманием возникают неясности. Я решил в этой статье разобрать рекурсию в PHP на достаточно простом и реальном примере из практики.
Не секрет, что все данные (за редким исключением), приходящие из форм, надо пропускать через функцию htmlspecialchars(), дабы избежать XSS. И я думаю, что Вы знаете, что некоторые входные данные являются массивами (например, при той же загрузке файлов). И наша с Вами задача написать такую функцию, которая принимает массив всех входящих данных, а также учесть, что среди этих данных есть также массивы, внутри которых также могут быть массивы и так далее.
Привожу код функции:
<?php
function xss($data) {
if (is_array($data)) { // Если это массив
$result = array(); // Создаём новый массив
foreach ($data as $key => $value) { // Перебираем исходный массив
$result[$key] = xss($value); // Рекурсивно вызываем функцию xss
}
return $result; // Возвращаемый "защищённый" массив
}
return htmlspecialchars($data, ENT_QUOTES); // Если это не массив, то вызываем htmlspecialchars()
}
$data = xss($_REQUEST); // Пример вызова функции
?>
Ключевым моментом здесь является, что внутренних массивов внутри входящего $data может быть очень много, поэтому без рекурсии в PHP здесь не обойтись. А сам алгоритм простой:
- Если входящие данные - это НЕ массив, то просто вызываем функцию htmlspecialchars().
- Если входящие данные - это массив, то перебираем все элементы массива и для каждого вызываем эту же функцию. А дальше возвращаемся к пункту 1.
Я понимаю, что для новичков рекурсия в PHP - это достаточно сложная вещь, но я рекомендую прямо пройтись по коду, как будто Вы интерпритатор PHP. Тогда станет всё яснее.
-
- Михаил Русаков
Комментарии (6):
А зачем нужен глобальный массив $_REQUEST ? Что-то то я не могу понять
Ответить
Владислав, для того чтобы хранить переменные, которые Вы передаете через HTTP запрос. Например данные из формы методом POST или GET значения после знака "?" в url или когда получаете куки в заголовках. POST, GET, COOKIE данные хранятся в глобальном массиве $_REQUEST.
Ответить
Я это знаю, но я читал что таое не безопасно делать в любых функциях
Ответить
$_REQUEST здесь просто как пример. В нём хранится очень много данных, о которых Максим написал выше, и можно всё обезопасить. На практике же вызывается данная функция для $_POST, для $_GET иля для $_FILES. А иногда действительно используется $_REQUEST, ничего опасного в этом нет. Данный массив столько же опасен, сколько, например, и $_GET.
Ответить
Я так и думал, но просто я однажды переводил один английский сайт(ссылку не помню) и там было написано что в функциях лучше не выводить никакие глобальные массивы как гет или пост, потому что незначительно падает скорость и безопасность... Значит всё таки неправду пишут :)
Ответить
Здравствуй Михаил! Вот рекурсия с "htmlspecialchars" из твоих уроков. Я попробовал проверить работу рекурсии двумерным массивом. Почему то у меня не в одном браузере функция "htmlspecialchars" в рекурсии с двумерным массивом не срабатывает! Я что то делаю не правильно? function secureData($data) { foreach ($data as $key => $value) { if (is_array($value)) secureData($value); else $data[$key] = htmlspecialchars($value); } return $data; } print_r (secureData($data));
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.