Форум русской поддержки Joomla!® CMS
28.07.2017, 20:59:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Основной курс по Joomla
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Mambo 4.5 исправить редактор (обрезает теги)

 (Прочитано 440 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Vaska
Захожу иногда
**

Репутация: +0/-2
Offline Offline

Сообщений: 14


« : 14.06.2017, 08:27:38 »

Приветствую!

Пользую Mambo 4.5 (1.0.9).
Установлен редактор - компонент HTMLArea3 XTD-C 1.1.

Редактор убирает пробелы в параметрах любого тега. Если в параметр прописать два слова: большой каток, то после сохранения получим: большойкаток. Или если в параметр class прописать два класса, то он их склеит убрав пробел.

За это отвечает файл class.inputfilter.php
Содержимое файла:
Код:
<?php

/** @class: InputFilter (PHP4 & PHP5, with comments)
  * @project: PHP Input Filter
  * @date: 10-05-2005
  * @version: 1.2.2_php4/php5
  * @author: Daniel Morris
  * @contributors: Gianpaolo Racca, Ghislain Picard, Marco Wandschneider, Chris Tobin and Andrew Eddie.
  * @copyright: Daniel Morris
  * @email: dan@rootcube.com
  * @license: GNU General Public License (GPL)
  */
class InputFilter {
var $tagsArray; // default = empty array
var $attrArray; // default = empty array

var $tagsMethod; // default = 0
var $attrMethod; // default = 0

var $xssAuto;           // default = 1
//var $tagBlacklist = array('applet', 'body', 'bgsound', 'base', 'basefont', 'embed', 'frame', 'frameset', 'head', 'html', 'id', 'iframe', 'ilayer', 'layer', 'link', 'meta', 'name', 'object', 'script', 'style', 'title', 'xml');
var $tagBlacklist = array('applet', 'body', 'bgsound', 'base', 'basefont', 'embed', 'frame', 'frameset', 'head', 'html', 'iframe', 'ilayer', 'layer', 'link', 'meta', 'name', 'style', 'title', 'xml');
var $attrBlacklist = array('action', 'background', 'codebase', 'dynsrc', 'lowsrc');  // also will strip ALL event handlers

/**
 * Constructor for inputFilter class. Only first parameter is required.
 * @access constructor
 * @param Array $tagsArray - list of user-defined tags
 * @param Array $attrArray - list of user-defined attributes
 * @param int $tagsMethod - 0= allow just user-defined, 1= allow all but user-defined
 * @param int $attrMethod - 0= allow just user-defined, 1= allow all but user-defined
 * @param int $xssAuto - 0= only auto clean essentials, 1= allow clean blacklisted tags/attr
 */
function inputFilter($tagsArray = array(), $attrArray = array(), $tagsMethod = 0, $attrMethod = 0, $xssAuto = 1) {
// make sure user defined arrays are in lowercase
for ($i = 0; $i < count($tagsArray); $i++) $tagsArray[$i] = strtolower($tagsArray[$i]);
for ($i = 0; $i < count($attrArray); $i++) $attrArray[$i] = strtolower($attrArray[$i]);
// assign to member vars
$this->tagsArray = (array) $tagsArray;
$this->attrArray = (array) $attrArray;
$this->tagsMethod = $tagsMethod;
$this->attrMethod = $attrMethod;
$this->xssAuto = $xssAuto;
}

/**
 * Method to be called by another php script. Processes for XSS and specified bad code.
 * @access public
 * @param Mixed $source - input string/array-of-string to be 'cleaned'
 * @return String $source - 'cleaned' version of input parameter
 */
function process($source) {
// clean all elements in this array
if (is_array($source)) {
foreach($source as $key => $value)
// filter element for XSS and other 'bad' code etc.
if (is_string($value)) $source[$key] = $this->remove($this->decode($value));
return $source;
// clean this string
} else if (is_string($source)) {
// filter source for XSS and other 'bad' code etc.
return $this->remove($this->decode($source));
// return parameter as given
} else return $source;
}

/**
 * Internal method to iteratively remove all unwanted tags and attributes
 * @access protected
 * @param String $source - input string to be 'cleaned'
 * @return String $source - 'cleaned' version of input parameter
 */
function remove($source) {
$loopCounter=0;
// provides nested-tag protection
while($source != $this->filterTags($source)) {
$source = $this->filterTags($source);
$loopCounter++;
}
return $source;
}

/**
 * Internal method to strip a string of certain tags
 * @access protected
 * @param String $source - input string to be 'cleaned'
 * @return String $source - 'cleaned' version of input parameter
 */
function filterTags($source) {
// filter pass setup
$preTag = NULL;
$postTag = $source;
// find initial tag's position
$tagOpen_start = strpos($source, '<');
// interate through string until no tags left
while($tagOpen_start !== FALSE) {
// process tag interatively
$preTag .= substr($postTag, 0, $tagOpen_start);
$postTag = substr($postTag, $tagOpen_start);
$fromTagOpen = substr($postTag, 1);
// end of tag
$tagOpen_end = strpos($fromTagOpen, '>');
if ($tagOpen_end === false) break;
// next start of tag (for nested tag assessment)
$tagOpen_nested = strpos($fromTagOpen, '<');
if (($tagOpen_nested !== false) && ($tagOpen_nested < $tagOpen_end)) {
$preTag .= substr($postTag, 0, ($tagOpen_nested+1));
$postTag = substr($postTag, ($tagOpen_nested+1));
$tagOpen_start = strpos($postTag, '<');
continue;
}
$tagOpen_nested = (strpos($fromTagOpen, '<') + $tagOpen_start + 1);
$currentTag = substr($fromTagOpen, 0, $tagOpen_end);
$tagLength = strlen($currentTag);
if (!$tagOpen_end) {
$preTag .= $postTag;
$tagOpen_start = strpos($postTag, '<');
}
// iterate through tag finding attribute pairs - setup
$tagLeft = $currentTag;
$attrSet = array();
$currentSpace = strpos($tagLeft, ' ');
// is end tag
if (substr($currentTag, 0, 1) == "/") {
$isCloseTag = TRUE;
list($tagName) = explode(' ', $currentTag);
$tagName = substr($tagName, 1);
// is start tag
} else {
$isCloseTag = FALSE;
list($tagName) = explode(' ', $currentTag);
}
// excludes all "non-regular" tagnames OR no tagname OR remove if xssauto is on and tag is blacklisted
if ((!preg_match("/^[a-z][a-z0-9]*$/i",$tagName)) || (!$tagName) || ((in_array(strtolower($tagName), $this->tagBlacklist)) && ($this->xssAuto))) {
$postTag = substr($postTag, ($tagLength + 2));
$tagOpen_start = strpos($postTag, '<');
// don't append this tag
continue;
}
// this while is needed to support attribute values with spaces in!
while ($currentSpace !== FALSE) {
$fromSpace = substr($tagLeft, ($currentSpace+1));
$nextSpace = strpos($fromSpace, ' ');
$openQuotes = strpos($fromSpace, '"');
$closeQuotes = strpos(substr($fromSpace, ($openQuotes+1)), '"') + $openQuotes + 1;
// another equals exists
if (strpos($fromSpace, '=')!== FALSE) {
// opening and closing quotes exists
if (($openQuotes !== FALSE) && (strpos(substr($fromSpace, ($openQuotes+1)), '"')!== FALSE))
$attr = substr($fromSpace, 0, ($closeQuotes+1));
// one or neither exist
else $attr = substr($fromSpace, 0, $nextSpace);
// no more equals exist
} else $attr = substr($fromSpace, 0, $nextSpace);
// last attr pair
if (!$attr) $attr = $fromSpace;
// add to attribute pairs array
$attrSet[] = $attr;
// next inc
$tagLeft = substr($fromSpace, strlen($attr));
$currentSpace = strpos($tagLeft, ' ');
}
// appears in array specified by user
$tagFound = in_array(strtolower($tagName), $this->tagsArray);
// remove this tag on condition
if ((!$tagFound && $this->tagsMethod) || ($tagFound && !$this->tagsMethod)) {
// reconstruct tag with allowed attributes
if (!$isCloseTag) {
$attrSet = $this->filterAttr($attrSet);
$preTag .= '<' . $tagName;
for ($i = 0; $i < count($attrSet); $i++)
$preTag .= ' ' . $attrSet[$i];
// reformat single tags to XHTML
if (strpos($fromTagOpen, "</" . $tagName)) $preTag .= '>';
else $preTag .= ' />';
// just the tagname
   } else $preTag .= '</' . $tagName . '>';
}
// find next tag's start
$postTag = substr($postTag, ($tagLength + 2));
$tagOpen_start = strpos($postTag, '<');
}
// append any code after end of tags
$preTag .= $postTag;
return $preTag;
}

/**
 * Internal method to strip a tag of certain attributes
 * @access protected
 * @param Array $attrSet
 * @return Array $newSet
 */
function filterAttr($attrSet) {
$newSet = array();
// process attributes
for ($i = 0; $i <count($attrSet); $i++) {
// skip blank spaces in tag
if (!$attrSet[$i]) continue;
// split into attr name and value
$attrSubSet = explode('=', trim($attrSet[$i]),2);
list($attrSubSet[0]) = explode(' ', $attrSubSet[0]);
// removes all "non-regular" attr names AND also attr blacklisted
if ((!eregi("^[a-z]*$",$attrSubSet[0])) || (($this->xssAuto) && ((in_array(strtolower($attrSubSet[0]), $this->attrBlacklist)) || (substr($attrSubSet[0], 0, 2) == 'on'))))
continue;
// xss attr value filtering
if ($attrSubSet[1]) {
// strips unicode, hex, etc
$attrSubSet[1] = str_replace('&#', '', $attrSubSet[1]);
// strip normal newline within attr value
$attrSubSet[1] = preg_replace('/\s+/', '', $attrSubSet[1]);
// strip double quotes
$attrSubSet[1] = str_replace('"', '', $attrSubSet[1]);
// [requested feature] convert single quotes from either side to doubles (Single quotes shouldn't be used to pad attr value)
if ((substr($attrSubSet[1], 0, 1) == "'") && (substr($attrSubSet[1], (strlen($attrSubSet[1]) - 1), 1) == "'"))
$attrSubSet[1] = substr($attrSubSet[1], 1, (strlen($attrSubSet[1]) - 2));
// strip slashes
$attrSubSet[1] = stripslashes($attrSubSet[1]);
}
// auto strip attr's with "javascript:
if (InputFilter::badAttributeValue( $attrSubSet ))
continue;

// if matches user defined array
$attrFound = in_array(strtolower($attrSubSet[0]), $this->attrArray);
// keep this attr on condition
if ((!$attrFound && $this->attrMethod) || ($attrFound && !$this->attrMethod)) {
// attr has value
if ($attrSubSet[1]) $newSet[] = $attrSubSet[0] . '="' . $attrSubSet[1] . '"';
// attr has decimal zero as value
else if ($attrSubSet[1] == "0") $newSet[] = $attrSubSet[0] . '="0"';
// reformat single attributes to XHTML
else $newSet[] = $attrSubSet[0] . '="' . $attrSubSet[0] . '"';
}
}
return $newSet;
}

/**
* Function to determine if contents of an attribute is safe
* @param Array A 2 element array for attribute [name] and [value]
* @return Boolean True if bad code is detected
*/
function badAttributeValue( $attrSubSet ) {
$attrSubSet[0] = strtolower( $attrSubSet[0] );
$attrSubSet[1] = strtolower( $attrSubSet[1] );
return (
((strpos($attrSubSet[1], 'expression')!== false) && ($attrSubSet[0]) == 'style') ||
(strpos($attrSubSet[1], 'javascript:')!== false) ||
(strpos($attrSubSet[1], 'behaviour:')!== false) ||
(strpos($attrSubSet[1], 'vbscript:')!== false) ||
(strpos($attrSubSet[1], 'mocha:')!== false) ||
(strpos($attrSubSet[1], 'livescript:')!== false)
);
}

/**
 * Try to convert to plaintext
 * @access protected
 * @param String $source
 * @return String $source
 */
function decode($source) {
// url decode
$source = html_entity_decode($source, ENT_QUOTES, "ISO-8859-1");
// convert decimal
$source = preg_replace('/&#(\d+);/me',"chr(\\1)", $source); // decimal notation
// convert hex
$source = preg_replace('/&#x([a-f0-9]+);/mei',"chr(0x\\1)", $source); // hex notation
return $source;
}

/**
 * Method to be called by another php script. Processes for SQL injection
 * @access public
 * @param Mixed $source - input string/array-of-string to be 'cleaned'
 * @param Buffer $connection - An open MySQL connection
 * @return String $source - 'cleaned' version of input parameter
 */
function safeSQL($source, &$connection) {
// clean all elements in this array
if (is_array($source)) {
foreach($source as $key => $value)
// filter element for SQL injection
if (is_string($value)) $source[$key] = $this->quoteSmart($this->decode($value), $connection);
return $source;
// clean this string
} else if (is_string($source)) {
// filter source for SQL injection
if (is_string($source)) return $this->quoteSmart($this->decode($source), $connection);
// return parameter as given
} else return $source;
}

/**
 * @author Chris Tobin
 * @author Daniel Morris
 * @access protected
 * @param String $source
 * @param Resource $connection - An open MySQL connection
 * @return String $source
 */
function quoteSmart($source, &$connection) {
// strip slashes
if (get_magic_quotes_gpc()) $source = stripslashes($source);
// quote both numeric and text
$source = $this->escapeString($source, $connection);
return $source;
}

/**
 * @author Chris Tobin
 * @author Daniel Morris
 * @access protected
 * @param String $source
 * @param Resource $connection - An open MySQL connection
 * @return String $source
 */
function escapeString($string, &$connection) {
// depreciated function
if (version_compare(phpversion(),"4.3.0", "<")) mysql_escape_string($string);
// current function
else mysql_real_escape_string($string);
return $string;
}
}

?>

В файле все функции подписаны.

Я думаю, что за мою проблему отвечает функция filterTags
И конкретно кусок кода внутри этой функции:
Код:
// this while is needed to support attribute values with spaces in!
while ($currentSpace !== FALSE) {
$fromSpace = substr($tagLeft, ($currentSpace+1));
$nextSpace = strpos($fromSpace, ' ');
$openQuotes = strpos($fromSpace, '"');
$closeQuotes = strpos(substr($fromSpace, ($openQuotes+1)), '"') + $openQuotes + 1;
// another equals exists
if (strpos($fromSpace, '=')!== FALSE) {
// opening and closing quotes exists
if (($openQuotes !== FALSE) && (strpos(substr($fromSpace, ($openQuotes+1)), '"')!== FALSE))
$attr = substr($fromSpace, 0, ($closeQuotes+1));
// one or neither exist
else $attr = substr($fromSpace, 0, $nextSpace);
// no more equals exist
} else $attr = substr($fromSpace, 0, $nextSpace);
// last attr pair
if (!$attr) $attr = $fromSpace;
// add to attribute pairs array
$attrSet[] = $attr;
// next inc
$tagLeft = substr($fromSpace, strlen($attr));
$currentSpace = strpos($tagLeft, ' ');
}

Но могу ошибаться с указанным куском кода. Проверяйте.

Задача: внести исправления в файле, чтобы не удаляло пробелы в аттрибутах тегов.


Заплачу 200 руб., после выполнения задания и тестирования.
Оплата на ЯД или карту сбербанка или на мобильный телефон, что более разумно за такую символическую оплату.
« Последнее редактирование: 15.06.2017, 09:09:21 от Vaska » Записан
nick71
Живу я здесь
******

Репутация: +12/-12
Offline Offline

Пол: Мужской
Сообщений: 1158


Сайты любой сложности - обращайтесь


« Ответ #1 : 14.06.2017, 18:34:51 »

Mambo ? в 2017 году? Круто... Тут если Joomla 2.5. видишь - напрягаешься, а тут такое...При этом доступа нет, дамп не дам, а дам какой-то левый архив, который заработает на PHP 4 (сейчас 7.1. а некоторые сайты не работают при Joomla 3.хх на PHP 5,6). Хотел предложить просто сделать с нуля на последней версии Joomla с переносом данных и со всем необходимым функционалом, плюс возможно смена дизайна на более современный (не видя сайт-донор могу предположить что если мамбо то там та еще красота) и адаптивный. Но дошел до строки с бюджетом и передумал.
Никого не хотел обидеть, сугубо рабочий взгляд на задачу.
Записан
ProtectYourSite
Завсегдатай
*****

Репутация: +47/-4
Offline Offline

Сообщений: 791



« Ответ #2 : 14.06.2017, 18:43:31 »

Что-то у меня этот архив и работать не захотел)
Записан
Vaska
Захожу иногда
**

Репутация: +0/-2
Offline Offline

Сообщений: 14


« Ответ #3 : 14.06.2017, 18:49:15 »

Что-то у меня этот архив и работать не захотел)
Я когда добавлял строку в базу о редакторе, то в конце строки поставил запятую, вместо точки с запятой.
Сейчас исправил.
Скачайте снова архив.
Записан
nick71
Живу я здесь
******

Репутация: +12/-12
Offline Offline

Пол: Мужской
Сообщений: 1158


Сайты любой сложности - обращайтесь


« Ответ #4 : 14.06.2017, 19:26:47 »

а без архива показать сайт можете, есть в онлайне? И рассматриваете ли мой вариант - с нуля, и т.д. И какой бюджет можете предложить? Сайт на Мамбо это ж жесть, и по функционалу и по безопасности.
Записан
ProtectYourSite
Завсегдатай
*****

Репутация: +47/-4
Offline Offline

Сообщений: 791



« Ответ #5 : 14.06.2017, 20:12:17 »

Не заходит в админку всё равно
Цитировать
ЄЧиНКБТЄФЎ, ГЛСКјиТ№ ЛГЧНГРґСєЎТГаўйТ¶Ц§ дБи¶ЩЎµйН§.  ЎГШіТЕН§гЛБи
В причинах лень разбираться
Записан
Vaska
Захожу иногда
**

Репутация: +0/-2
Offline Offline

Сообщений: 14


« Ответ #6 : 14.06.2017, 21:27:40 »

Не заходит в админку всё равноВ причинах лень разбираться
В файле базы уже есть строки, которые создают админа с логином admin и паролем admin
Попробуйте зайти под этими данными.

И перед этим откройте файл configuration.php и замените там язык на английский, если он там тайский в параметре $mosConfig_lang = 'english';
« Последнее редактирование: 14.06.2017, 21:32:15 от Vaska » Записан
ProtectYourSite
Завсегдатай
*****

Репутация: +47/-4
Offline Offline

Сообщений: 791



« Ответ #7 : 15.06.2017, 10:07:07 »

var $attrBlacklistvar $tagBlacklist - там список обрезает тегов, удалить ненужные и авось будет счастье.
var $attrBlacklist - удаляет атрибуты тегов.
Ну и немного оффтопа
Показать текстовый блок
« Последнее редактирование: 15.06.2017, 10:11:50 от ProtectYourSite » Записан
Vaska
Захожу иногда
**

Репутация: +0/-2
Offline Offline

Сообщений: 14


« Ответ #8 : 15.06.2017, 10:30:07 »

var $attrBlacklistvar $tagBlacklist - там список обрезает тегов, удалить ненужные и авось будет счастье.
var $attrBlacklist - удаляет атрибуты тегов.
Ну и немного оффтопа
Показать текстовый блок

Неужели Вы думаете, что я нашел искомый файл, закомментировал исходную строку, добавил исправленную строку, и не увидел список блеклистов? По тегам я уже сделал и опубликовал исправленный файл, в первом сообщении, вместе с изменением задания на новые условия.
Я уже сам всё сделал.
Чтобы не удаляло пробелы закомментировал $attrSubSet[1] = preg_replace('/\s+/', ' ', $attrSubSet[1]);
добавил $attrSubSet[1] = preg_replace('/[\n\r]/', '', $attrSubSet[1]);

Подсмотрел в файле для Joomla https://github.com/joomla-framework/filter/blob/master/src/InputFilter.php

П.С.
Кстати, дистрибутв у меня сразу инсталлировался, без каких либо проблем.
Странно, что у вас не пошло.
« Последнее редактирование: 15.06.2017, 10:50:54 от Vaska » Записан
ProtectYourSite
Завсегдатай
*****

Репутация: +47/-4
Offline Offline

Сообщений: 791



« Ответ #9 : 15.06.2017, 10:58:36 »

Рад за вас)
П.С.
Кстати, дистрибутв у меня сразу инсталлировался, без каких либо проблем.
Странно, что у вас не пошло.
Установился он без проблем, а вот в админку не пускало, с фронта заходило)
Записан
Vaska
Захожу иногда
**

Репутация: +0/-2
Offline Offline

Сообщений: 14


« Ответ #10 : 15.06.2017, 12:27:07 »

Вам выше voland написал прайс. Работа - 200р. Но надо скачать вашу версию, установить, внести правки и т.д. А это уже далеко не 200р. Вы думаете, кто то тут еще помнит Мамбу, которая сдохла 14 лет назад?

Файл у всех одинаковый, один и тот же, что у мамбы, что и у Joomla.
Только он отвечает за контроль ввода теста.

Это изначально было понятно тем, кто знает Joomla.
Поэтому ненужно цену набивать.
Ненужно было ничего скачивать и устанавливать. И так было понятно что нужно править.
Я сам сделал, и знаю что это была плёвая работа, на 5 минут.
Записан
Vaska
Захожу иногда
**

Репутация: +0/-2
Offline Offline

Сообщений: 14


« Ответ #11 : 15.06.2017, 12:42:41 »

Ржу. Ну пусть человек подождет исполнителя. Флуда тысяч на 5 уже написано.

Кого подождет?
Я уже сам всё сделал, Карл!
Записан
Taatshi
Support Team
*****

Репутация: +451/-3
Offline Offline

Пол: Женский
Сообщений: 4988



« Ответ #12 : 17.06.2017, 18:57:19 »

Народ. Кого не устраивает стоимость - пожалуйста, воздержитесь от флуда и займитесь чем-то еще. Мы в коммерческом разделе, а не во флейме.

Тема почищена.
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet