Вчера в Joomla VEL было объявлено об уязвимости в компоненте, которую я не хотел бы здесь упоминать, чтобы не распространять эту информацию, и которую я хотел бы исправить.
Эта уязвимость распространяется также на версию компонента Joomla 1.5, но команда компонента исправила уязвимость только в версиях Joomla 2.5 и 3.x. Я собираюсь опубликовать здесь функцию, которая была изменена в Joomla 2.5 и Joomla 3, и я хотел бы знать, могу ли я изменить ту же функцию тем же способом или другим способом, чтобы быть совместимым с версией Joomla 1.5 ,
В следующем примере, пожалуйста, учтите, что я отредактирую код, чтобы удалить имя компонента.
Итак, оригинальная функция в Joomla 3 была:
function _setExtension($option) {
static $components = array();
if (!isset($components[$option])) {
$filter = ComponentUtility::getSkippedComponents();
$component = ComponentDatabase::loadResult("SELECT `element` FROM `#__extensions` WHERE `type` = 'component' AND `element` NOT IN ({$filter}) AND `element` = '{$option}'");
Это было исправлено следующим образом:
function _setExtension($option) {
static $components = array();
if (!isset($components[$option])) {
$filter = ComponentUtility::getSkippedComponents();
$option = ComponentDatabase::escape($option);
$component = ComponentDatabase::loadResult("SELECT `element` FROM `#__extensions` WHERE `type` = 'component' AND `element` NOT IN ({$filter}) AND `element` = '{$option}'");
В Joomla 2.5 оригинальная функция была:
function _setExtension($option) {
static $components = array();
if (!isset($components[$option])) {
$filter = ComponentUtility::getSkippedComponents();
$component = ComponentDatabase::loadResult("SELECT `element` FROM `#__extensions` WHERE `type` = 'component' AND `element` NOT IN ({$filter}) AND `element` = '{$option}'");
Это было исправлено следующим образом:
function _setExtension($option) {
static $components = array();
if (!isset($components[$option])) {
$filter = ComponentUtility::getSkippedComponents();
$option = ComponentDatabase::getEscaped($option);
$component = ComponentDatabase::loadResult("SELECT `element` FROM `#__extensions` WHERE `type` = 'component' AND `element` NOT IN ({$filter}) AND `element` = '{$option}'");
В Joomla 1.5 оригинальная функция:
function _setExtension($option) {
static $components = array();
if (!isset($components[$option])) {
$filter = "'com_sef', 'com_sh404sef', 'com_joomfish', 'com_config', 'com_media', 'com_installer', 'com_templates', 'com_plugins', 'com_modules', 'com_cpanel', 'com_cache', 'com_messages', 'com_menus', 'com_massmail', 'com_languages', 'com_users'";
$component = ComponentDatabase::loadResult('SELECT `option` FROM `#__components` WHERE `parent` = "0" AND `option` NOT IN ('.$filter.') AND `option` = "'.$option.'"');
И это не было исправлено.
Итак, в Joomla 3 линия фиксации была:
$option = ComponentDatabase::escape($option);
В Joomla 2.5 линия крепления была:
$option = ComponentDatabase::getEscaped($option);
А в Joomla 1.5? Как я могу правильно экранировать параметр option и исправить функцию?
ComponentDatabase
не является классом, который по умолчанию принадлежит Joomla, поэтому он принадлежит вашему компоненту.
getEscaped однако это функция, которая принадлежит Joomla 1.5, которая просто получает экранированную строку из базы данных.
При условии, что ComponentDatabase
также относится к Joomla 1.5-совместимой версии этого компонента, должен иметь возможность делать то же, что и другие исправления:
$option = ComponentDatabase::getEscaped($option);
Если ComponentDatabase
не относится к версии компонента Joomla 1.5, затем скопируйте его из версии Joomla 2.5 (не 3.x) и помните, что вам, возможно, придется внести в него некоторые изменения.
Других решений пока нет …