Входная фильтрация массива целых чисел, слов

Это тот, который прослушивает меня уже несколько лет - Joomla предоставил JRequest, а затем JInput для доступа к отфильтрованным данным из входящего запроса. Вы можете запросить отфильтрованные строки, целые числа, слова и т. Д. Или вы можете запросить массив (либо просто используя getVar с единственным именем переменной, либо предполагая /проверяя, что возвращаемое значение является массивом, или, заставляя вопрос, поставляя несколько дополнительных параметров).

Но вы не можете запрашивать массив целых чисел, слов и т. д.

Я что-то пропустил?

Например, мои данные POST могут включать:

stuff[abc]=1
stuff[def]=75
stuff[123]=<script src="http://imanaughtysite.com/muahahaha.js"/>

Как мне задать JInput для «stuff» как массив целых чисел?

6 голосов | спросил John Rix 13 42014vEurope/Moscow11bEurope/MoscowThu, 13 Nov 2014 03:08:10 +0300 2014, 03:08:10

3 ответа


6

Хорошо, давайте посмотрим, какие варианты доступны. Ниже приведены примеры использования JInput и были протестированы в Joomla 3.3.

Я отправлю следующие данные в Joomla:

stuff[abc]=1
stuff[def]=75
stuff[123]=<script src="http://imanaughtysite.com/muahahaha.js"/>

Я хочу получить чистый массив целых чисел , поэтому ожидаемый результат:

$expectedResult = array(
    'abc' => 1,
    'def' => 75,
    '123' => 0,
);

Вариант 1 - JInput :: get () с фильтром ARRAY

$a1 = $app->input->get('stuff', array(), 'ARRAY');

Результат:

array (size=3)
  'abc' => string '1' (length=1)
  'def' => string '75' (length=2)
  123 => string '<script src="http://imanaughtysite.com/muahahaha.js"/>' (length=54)

BAD IDEA - как вы можете видеть, мы получаем наши данные, но он не фильтруется и не очищается вообще!

Вариант 2 - JInput :: getArray () при сообщении

$a2 = $app->input->post->getArray();

Результат:

array (size=1)
  'stuff' => 
    array (size=3)
      'abc' => string '1' (length=1)
      'def' => string '75' (length=2)
      123 => string '' (length=0)

Теперь у нас есть весь массив POST, очищенный. Но это больше информации, которую мы хотели, и это все еще не массив целых чисел.

Вариант 3 - JInput :: getArray (), определяющий ожидаемые параметры и их фильтр:

$a3 = $app->input->getArray(array(
    'stuff' => array(
        'abc' => 'INT',
        'def' => 'INT',
        '123' => 'INT'
    )
));

Результат:

array (size=1)
  'stuff' => 
    array (size=3)
      'abc' => int 1
      'def' => int 75
      123 => int 0

На самом деле это первая версия, которая обеспечивает то, что нам нужно. Мы можем индивидуально определить фильтр и получить результат. stuff необходимо извлечь из результирующего массива и с помощью функции PHP, такой как array_values, мы также можем извлечь только значения, сбросив ключи.

Вариант 4 - Улучшение JInput :: getArray ()

Хотя вариант 3 может работать хорошо, есть некоторые проблемы:

  • Что делать, если мы заранее не знаем названия полей?
  • Что делать, если у меня есть более 100 полей - я не хочу писать каждый из них.

Чтобы решить эти проблемы, нам нужно сделать это в следующих шагах:

// Get the data unfiltered
$unfilteredData = $app->input->get('stuff', array(), 'ARRAY');

// Pre-filling all parameters with the INT filter.
$a4 = $app->input->getArray(array(
    'stuff' => array_fill_keys(array_flip($unfilteredData), 'INT')
));

Результат:

array (size=1)
  'stuff' => 
    array (size=4)
      'abc' => int 1
      'def' => int 75
      123 => int 0

Возможная проблема с безопасностью, если вам нужны клавиши : мы фильтруем значения, но не ключи!

Некоторая простая обработка:

$finalArray = array_values($a4['stuff']);

array (size=4)
  0 => int 1
  1 => int 75
  2 => int 0

ОТВЕТ НА ЗДЕСЬ: -> Полный код для получения массива с n-параметрами в виде целых чисел из запроса POST (идеально подходит для этого метода):

// Get the data unfiltered
$unfilteredData = $app->input->get('stuff', array(), 'ARRAY');

// Check to see if array is empty.
if (! empty($unfilteredData))
{
    $a4 = $app->input->getArray(array(
        'stuff' => array_fill_keys(array_flip($unfilteredData), 'INT')
    ));

    $result = array_values($a4['stuff']);
}
else
{
    $result = array();
}
ответил Valentin Despa 22 62014vEurope/Moscow11bEurope/MoscowSat, 22 Nov 2014 14:52:24 +0300 2014, 14:52:24
7

Joomla не поддерживает несколько типов в качестве фильтров.

Это невозможно сделать с использованием JRequest или JInput.

В Joomla до сих пор нет обходного пути. Вам нужно обрабатывать только несколько фильтров только в вашем коде.

ответил Nick 13 42014vEurope/Moscow11bEurope/MoscowThu, 13 Nov 2014 09:07:49 +0300 2014, 09:07:49
4

Ты точно ничего не пропустил. Если вы обнаружите, что делаете это регулярно, вы можете создать системный плагин для расширения существующего класса JRequest и добавить к нему новый тип фильтра.

ответил Jeremy Proffitt 13 42014vEurope/Moscow11bEurope/MoscowThu, 13 Nov 2014 22:45:59 +0300 2014, 22:45:59

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132