Сегодня я хочу поговорить о обработке пользовательского ввода и о том как защититься от нежелательных данных, которые могут быть потенциально опасны, средствами joomla framework .

На замену классу JRequest в Joomla начиная с версии 2.5 приходит класс JInput. Класс JRequest отныне считается устаревшим и не рекомендуется его использовать.
Хотя в Joomla 2.5.x все ещё много мест где используется устаревший класс JRequest и никто не помешает вам его использовать!

В новых версиях все меньше и меньше используется этот класс! Немного проведя исследоваения Joomla 3.0 Alpha 2 я отыскал всего 135 использований класса JRequest, в то время как в Joomla 2.5.6 я нашел 689 использований!
Возможно в стабильной версии Joomla 3.0 уже и не будет использования класса JRequest либо в следующих апгрейдах выпилят, так что лучше заранее разобраться что это за класс и с чем его едят )

Для использования JInput достаточно вызвать следующий код:

$jinput = JFactory::getApplication()->input;

Для того что бы установить какое то значение для переменной в объекте $jinput служит метод set($name, $value), нам нужно передать два параметра в метод: имя переменной и значение.
Например в административной части главное меню блокируется таким кодом:

$jinput = JFactory::getApplication()->input;
$jinput->set( 'hidemainmenu', true );

Для получения данных через класс JInput существует метод get($name, $default, $type)
Где:
$name - имя переменной
$default - значение по умолчанию
$type - тип фильтрации

Метод универсальный через него можно получить и отфильтровать любой тип данных который будет указан в переменной $type например:

$jinput = JFactory::getApplication()->input;
$jinput->get( 'id', 1, 'INT );

Но также в классе JInput есть синоним этого метода

$jinput = JFactory::getApplication()->input;
$jinput->getInt( 'id', 1 );

Этот метод выполняет все тоже что и $jinput->get( 'id', 1, 'INT ); но только в нем уже указан тип фильтрации!

Ниже привожу таблицу типов фильтрации, для чего каждая предназначена и синоним для этого типа:

ТипЗначениеСиноним
INT или INTEGER Целочисельная переменная getInt($name, $default)
UINT Беззнаковое целое число getUint($name, $default)
FLOAT или DOUBLE Числа с плавающей точкой getFloat($name, $default)
BOOL или BOOLEAN Будевые типы переменных getBool($name, $default)
WORD Только одно слово! Тоесть перменная со значением 'word1 word2' будет преобразованна в 'wordword' getWord($name, $default)
ALNUM Вернет переменную в которой будут только числа и буквы getAlnum($name, $default)
CMD Значение для командной переменной, например если мы хотим определить какой сейчас вид или задача. getCmd($name, $default)
BASE64 Получение строки зашифрованной с помощью base64 getBase64($name, $default)
STRING Получение строки getString($name, $default)
HTML Получение HTML кода, все потенциально опасные теги удаляются! Список тегов которые не пропускает эта функция: 'applet', 'body', 'bgsound', 'base', 'basefont', 'embed', 'frame', 'frameset', 'head', 'html', 'id', 'iframe', 'ilayer', 'layer', 'link', 'meta', 'name', 'object', 'script', 'style', 'title', 'xml' getHtml($name, $default)
PATH Путь к файлу или папке getPath($name, $default)
ARRAY Массив getArray(array $vars, $datasource = null)
USERNAME Имя пользователя getUsername($name, $default)

Тип фильтрации регистронезависим, так что вы можете написать хоть INT хоть int хоть InT и все равно все будет работать!

Естественно класс Jinput содержит функционал для работы с файлами. Для того что бы получать файлы для их последующей обработки рассмотрим пример формы:

<form action="?" method="post" enctype="multipart/form-data">
    <input type="file" name="jform[file]">
    <input type="submit">
</form>

Что бы получить файл из переменной JForm[file] нужно написать следующий код:

$jinput = JFactory::getApplication()->input;
$files = $jinput->files->get( 'jform', array(), 'array' );

В переменой $files будут все загруженный файлы из массива jform