Печать

JRequest - фильтрация данных $_GET и $_POST

При проектировании любого веб-приложения (и даже не только веб!) очень важно проверять все входные данные перед их использованием. Элементарная проверка данных позволяет увеличить безопасность вашего сайта в разы! Joomla предоставляет нам набор библиотек для проверки GET/POST запросов. Рассмотрим возможности класса JRequest на реальных примерах.

Пример №1. Допустим мы хотим получить Ф.И.О. человека из поля "fio" формы, и сохранить значение в переменную $name. При этом мы точно не можем сказать каким методом (GET или POST) будет отправлена форма. Делаем следующее:

 $name = JRequest::getVar('fio');

При этом, если не установлены другие параметры, то с начала и конца строки удаляться пробелы, и текст будет очищен от HTML-форматирования.

Пример №2. Часто бывают случаи когда переменная может и не придти от пользователя, либо её тип не совпадет с ожидаемым. В качестве второго параметра можно указать "Значение по умолчанию":

$name = JRequest::getVar('fio', 'Неизвестный пользователь');

Теперь, если человек, при заполнении формы не укажет свое имя, ему будет присвоено имя "Неизвестный пользователь".

Пример №3. Очень часто разработчики предпочитают явно указывать откуда они хотят получить переменную. Это слегка увеличивает безопасность компонента, а так же упрощает работу, например при использовании технологии AJAX.

Помните, что запрос POST также легко подделать как и GET, тем не менее мы рекомендуем вам явно указывать подобные моменты, это поможет содержать Ваше приложение в порядке.

$name = JRequest::getVar('fio', 'Неизвестный пользователь', 'get');

Теперь переменная явно будет браться из массива $_GET. Если третьим параметром ничего не указать, то значения будут браться из массива $_REQUEST.

В качестве атрибута можно использовать одно из следующих ключевых слов:

  • GET
  • POST
  • FILES
  • COOKIE
  • ENV
  • SERVER
  • REQUEST

 Пример №4. Четвертым параметром явно указываем тип переменной. В нашем случае это "string".

$name = JRequest::getVar('fio', 'Неизвестный пользователь', 'get', 'string');

Так же поддерживаются следующие типы:

  • int - Целочисленые значения
  • float - Число с плавающей точкой
  • bool - Булево значение
  • word - слово
  • cmd - команда
  • string - строка

Для удобства вы можете использовать методы класса "JRequest" следующего типа:

  • getInt
  • getFloat
  • getBool
  • getWord
  • getCmd
  • getString
  • get

Методы выполняют ту же самую роль что и "getVar", аргументы те же, за исключением того что нет маски и типа переменной. Метод "get" использует два параметра - название переменной и маска.

Пример №5. Наконец-то пятым параметром мы можем наложить маску фильтрации. Фильтр устанавливает специальным числом - битом. Маски бывают 3 типов:

  • 1 - JREQUEST_NOTRIM - если установлен, то пробелы по краям не обрежутся, по умолчанию пробелы отсекаются.
  • 2 - JREQUEST_ALLOWRAW - если установлен, то будет отключена всякая фильтрация, при этом более высокие биты игнорируются.
  • 4 - JREQUEST_ALLOWHTML - позволяет html-код. Но если установлен, то все равно будет включен фильтр безопасности по очистке html-кода.

Можно использовать несколько фильтров. Допустим нам нужно оставить пробелы по краям и не вырезать html-код. Для этого мы вписываем пятым параметром 5 (1+4), либо можно через константы - "JREQUEST_NOTRIM+JREQUEST_ALLOWHTML".

На практике это выглядит так:

// через бит
$name = JRequest::getVar('fio', 'Неизвестный пользователь', 'get', 'string', 5);
// либо через константы
$name = JRequest::getVar('fio', 'Неизвестный пользователь', 'get', 'string', JREQUEST_NOTRIM + JREQUEST_ALLOWHTML);

Пример №6. Получим массив значений, который пришел в POST с помощью класса JRequest. Напомним что массив можно отправить следующим способом:

<form action="index.php" method="post">
    <input type="checkbox" name="elements[]" />
    <input type="checkbox" name="elements[]" />
    <input type="checkbox" name="elements[]" />
</form>

Получить эти значения можно так:

$elements = JRequest::getVar('elements', array(), 'post');
if(count($elements)) {
    foreach($elements as $key=>$val){
        /* работа с массивом */
    }
} 

Объявление класса

Файл в котором описан статический класс JRequest находиться по адресу

[корень сайта]/libraries/joomla/environment/request.php

Класс для любого расширения объявлен всегда, и не нуждается в явном подключении через jimport();

Интересная статья? Поделись ей с другими: