昨天在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?如何正确地转义选项参数并修复函数?
ComponentDatabase
不是属于Joomla的类,因此它属于您的组件。
然而,getEscaped是属于Joomla 1.5的一个函数,它只是从数据库中获取一个转义字符串。
假设ComponentDatabase
也属于这个组件的Joomla 1.5兼容版本,应该能够做与其他修复相同的事情:
$option = ComponentDatabase::getEscaped($option);
如果ComponentDatabase
不属于组件的Joomla 1.5版本,则将其从Joomla 2.5版本(而非3.x)复制过来,并记住您可能需要对其进行一些调整。