RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

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();

Смотрите также:
Комментарии (5) Добавить комментарий
  • Михаил
    Михаил
    14 Февраля 2012, 18:58
     ↑  +6  ↓     ответ

    Отличная статья, полезно порой разjбраться как работают разные CMS

  • Vitaut
    Vitaut
    30 Июля 2012, 11:24
     ↑  0  ↓     ответ

    Спасибо большое за статью. Благодаря Вашему сайту я начал разбираться в Joomla API.

  • Дмитрий
    Дмитрий
    15 Апреля 2013, 05:47
     ↑  0  ↓     ответ

    Спасибо за статью! Я начинающий, поэтому подскажите пожалуйста, как правильно настроить передачу файла через этот класс? Речь идет от функции addAttachment..

  • vit
    vit
    16 Апреля 2013, 16:28
     ↑  0  ↓     ответ

    Не думал даже, что getVar столько параметров имеет. Круто!

  • Vera
    Vera
    31 Мая 2013, 18:12
     ↑  0  ↓     ответ

    C joomla 1.5 ничего не изменилось? dimation.ru/articles/joomla/103-jrequest-data-filtering--get-and--post

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.