0 Пользователей и 1 Гость просматривают эту тему.
  • 15 Ответов
  • 2750 Просмотров
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
Ни для кого не секрет, что использование AJAX запросов в модулях без нарушения безопасности Joomla проблематичная задача. Этот компонент педназначен для того, чтобы облегчить и обезопасить использование AJAX в модулях.

Правила использования компонента

1. Настройки.
Впишите в настройки компонента модули и функции хелперов этих модулей, которые можно запускать через компонент ajaxmod.
Правила: в строке пишется связка название_модуля::название_функции без кавычек и слешей через два двоеточия, название функции без скобок.
В следующей строке в такой-же последовательности можно написать другую функцию модуля, либо функцию другого модуля. Пример:

Код
mod_banners::funcAjax
mod_asd::other_func
mod_custom::echoAjax

2. В аякс-запросе используем такуюу строку -
Код
index.php?option=com_ajaxmod&format=raw&module=mod_module&function=your_function..........
где mod_module - название модуля от которого исходит аякс-запрос, your_function - функция в helper.php вашего модуля, которую нужно использовать.

3. При получении этого запроса компонент подключит файл хелпера вашего модуля, выполнит указанную функцию (если это разрешено) и напечатает то, что она вернет (так нужно для передачи данных ява-скрипту).

4. Вызываемая функция не должна иметь входящих аргументов, все что ей надо для работы выдавать в аякс-запрос и забирать из реквеста.

Компонент написан для Joomla 1.7.

Скачать можно здесь http://argens.ru/index.php/my-extension/9-my-extension/6-ajaxmod
« Последнее редактирование: 05.02.2012, 21:04:03 от Arkadiy »
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Ну получается, что через такой компонент можно будет вызвать любую функцию из хелпера любого модуля... Мне кажется это небезопасно.
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
Но зато это менее опасно, чем нынешнее положение с аякс-запросами, к сожалению я не знаю методов отслеживания места возникновения запросов, но с другой стороны php гораздо опаснее HTML, однако голый HTML нас уже не удовлетворяет.

К тому-же возможность взять любую функцию из любого хелпера несет только гипотетическую опасность, а реальной я не вижу.
К тому-же манипуляции из командной строки браузера и т.п. пресечены т.к. пропускаются только аякс-запросы.
« Последнее редактирование: 28.10.2011, 22:08:31 от Arkadiy »
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
К тому-же возможность взять любую функцию из любого хелпера несет только гипотетическую опасность, а реальной я не вижу.
Ну по стандартным модулям особого примера не покажу, но теоретически такая проблема может быть. Вот смотри, есть модуль mod_random_image, у него есть modRandomImageHelper, у которого 3 метода: getRandomImage, getImages и getFolder. Стандартный порядок вызова каков? Вызывается модуль, модуль передает параметры в getFolder, получает папку, передает в getImages, получает список - выбирает случайное и показывает. А что будет, если мы можем вызвать любой метод? Можно напрямую вызывать getImages и получить список картинок из любой папки на сервере. Да, в этом конкретном примере есть одно но - в модуле getImages первым параметром идет объект JRegistry и если мы туда передадим NULL, то код "упадет" на строчке:
Код: php
$type		= $params->get('type', 'jpg');

Но ведь это первый попавшийся модуль... А в модулях сторонних расширений может быть множество сервисных функций, которые никак не должны вызываться напрямую.

К тому-же манипуляции из командной строки браузера и т.п. пресечены т.к. пропускаются только аякс-запросы.
Ну это ведь вообще фигня, ведь тот же AJAX-запрос можно сделать прямо из браузера, налету, с помощью того же FireBug... А можно налету подменить параметры запроса... Многое можно, и прежде чем что-то на сервере вызывать, нужно 100 раз проверить...
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
Код
А в модулях сторонних расширений может быть множество сервисных функций, которые никак не должны вызываться напрямую.
Для этого надо разработчикам модулей озаботиться безопасностью своих методов, например делать приватными такие функции, одно слово в коде и метод не запустишь извне. Это будет правильный подход.

Кстати, можно ограничить пространство имен функций, вызываемых компонентом, напимер функция должна иметь в имени 'ajaxMod', иначе не будет вызвана, как такое решение?

Так-же можно проверить заголовок реферер на наличие JPATH::uri();

« Последнее редактирование: 31.10.2011, 05:27:57 от Arkadiy »
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Для этого надо разработчикам модулей озаботиться безопасностью своих методов, например делать приватными такие функции, одно слово в коде и метод не запустишь извне. Это будет правильный подход.
вот только есть тонны модулей, написанных разработчиками задолго до появления Ajaxmod, да и то, что кто-то вызывает метод вспомогательного класса, это вообще-то больше проблема вызывающего, чем автора. Автор предусмотрел некий сценарий работы, порядок вызовов, а если мы будем вызывать по-своему, не факт, что оно должно работать. Это как в 1.0 и 1.5 событие onPrepareContent, которые стандартно вызывается для объектов com_content, а по факту, народ дергает его в модулях, подсовывая что угодно, и порой полей не хватает. Но это же не проблема разработчиков Joomla? И не проблема автором плагинов для com_content, которые уверены, что у объекта будет некое конкретное поле (например, catid).

Кстати, можно ограничить пространство имен функций, вызываемых компонентом, напимер функция должна иметь в имени 'ajaxMod', иначе не будет вызвана, как такое решение?
Вот это уже лучше, но это лишает универсальности - придется допиливать модули. Можно подумать о том, чтобы в параметрах компонента указывать, какие методы и каких именно хелперов можно вызывать.

Так-же можно проверить заголовок реферер на наличие JPATH::uri();
От подмены параметров при вызове прямо средствами браузера (Firebug) - не спасет
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
Цитировать
Вот это уже лучше, но это лишает универсальности - придется допиливать модули. Можно подумать о том, чтобы в параметрах компонента указывать, какие методы и каких именно хелперов можно вызывать.
Модули допиливать всяко разно придется т.к. такого способа работы с модулями еще небыло, но подумаю о настройках, в принципе это не сложно. Допустим делаем два параметра - допущенные модули и допущенные функции, если данные из запроса попадают в эти массивы - пропускаем, если нет - обрубаем. Так и сделаю.
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
Сделал настройки разрешений. Переписал первый пост, перезалил модуль.
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
4. Вызываемая функция не должна иметь входящих аргументов
а зачем такое ограничение? почему-бы не разрешить передачу параметров (JSON)?
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
А каким образом я могу отобразить их в запросе или узнать что они есть и нужны и какие?
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Ну если точно известно, какой метод вызывается, то почему бы не дать возможность предать в него параметры?
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
Честно говоря пока не представляю как, но хорошо представляю как брать данные из реквеста в php, никаких трудностей это не вызывает, но если подскажешь способ, то подумаю.
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
Ну допустим можно усложнить конфиг, писать туда название переменной, которую надо взять из реквеста, возьму, подставлю, но по-моему это переливание из пустого в порожнее.
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
Но если функции пишут разработчики, то конфиг придется пользователям заполнять, по этому туда надо только самый необходимый минимум.
*

SDKiller

  • Живу я здесь
  • 2706
  • 328 / 5
  • ...ergo sum
Передавать в запросе упорядоченный массив, в функцию передавать через call_user_func_array
*

Arkadiy

  • Гуру
  • 5315
  • 462 / 2
  • Крепитесь, други.
В любом случае мы должны либо каким-то образом знать, какие аргументы нужны функции, либо указать какие параметры и как можно передавать. Что то, что другое - излишнее усложнение функционала, не приводящее к какому-либо лучшему результату, чем просто взять данные для функции из реквеста самой функцией.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Компонент SP Polls - не подхватывает русский язык

Автор Missile

Ответов: 18
Просмотров: 3125
Последний ответ 07.06.2020, 11:18:23
от xpank
Плагин Fullajax. Добавить события на ссылки добавленные через ajax

Автор Den JW

Ответов: 0
Просмотров: 596
Последний ответ 11.05.2020, 18:11:39
от Den JW
Настройка компонент Jotcache

Автор lgmax

Ответов: 27
Просмотров: 2230
Последний ответ 11.03.2019, 19:18:44
от ProtectYourSite
Настройка модуля поиска Universal AJAX Live Search

Автор alex9158

Ответов: 0
Просмотров: 1055
Последний ответ 20.11.2017, 17:46:40
от alex9158
Поиск на сайт Universal AJAX Live Search

Автор alex9158

Ответов: 1
Просмотров: 853
Последний ответ 09.09.2017, 22:04:46
от alex9158