Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#1 2009-08-17 20:32:00

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Ломанули сайт

Ну вот и случилось, ломанули меня = ) Собственно вопрос где латать дыру, при заходе на сайт выскакивает сообщение JavaScrip, два сообщения:

1-ое

XSS

жмём ок, далее

2-ое

XaсKed by...

в сообщениях в комментариях нашёл текст написанный им

[img]javascript:alert('XSS')[/img]

Где-то уязвимость XSS, собственно вопрос как это дело залатать ?

Стоит 0.9.0 Release

Не в сети

#2 2009-08-17 20:38:12

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: Ломанули сайт

URL?
И проверь, стоит ли у тебя последний FixPack.

Не в сети

#3 2009-08-17 20:44:48

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Re: Ломанули сайт

vitaly пишет:

URL?
И проверь, стоит ли у тебя последний FixPack.

Стоит [15.11.2008] 0.9.0 Release

URL сейчас отправлю в личку, правда то сообщение которое:

[img]javascript:alert('XSS')[/img]

я в двух местах удалил, теперь то сообщение не выскакивает, но это не решает проблему как-то же он это провернул и где-то в коде факт оставил ещё следы...

Изменено zheka (2009-08-17 20:53:29)

Не в сети

#4 2009-08-17 21:02:09

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: Ломанули сайт

Тебе ведь в таком виде комментарий оставили?
Попробовал только что - не получается.

И обновись именно до последней версии - к 0.9.0 было ещё несколько FixPack'ов, последний доступен тут

Не в сети

#5 2009-08-17 21:08:56

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Re: Ломанули сайт

vitaly пишет:

Тебе ведь в таком виде комментарий оставили?
Попробовал только что - не получается.

И обновись именно до последней версии - к 0.9.0 было ещё несколько FixPack'ов, последний доступен тут

Да именно в таком, ты вот сейчас написал и у меня по крайней мере на опере выскочило опять сообщение о XSS
Мне надо поверх всего залить только FixPack #04 по твоей ссылке ?

Не в сети

#6 2009-08-17 21:11:09

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Re: Ломанули сайт

Проверяю у себя на IE не срабатывает такое, знакомый проверяет на своём компьютере на IE у него срабатывает, проверили на FireFox тоже не срабатывает, на опере срабатывает. вот такие дела...

Изменено zheka (2009-08-17 21:31:16)

Не в сети

#7 2009-08-17 21:32:18

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: Ломанули сайт

О как. Похоже, это "оригинальная" особенность оперы (у меня у самого FF).

В качестве фикса попробуй сделать так.
1. В файле /engine/includes/classes/parse.class.php найти строки (~216):

				// Now let's compose a resulting URL
				$outkeys [] = 'src="'.((!$keys['src'])?$alt:$keys['src']).'"';

2. и перед ними добавь:

	$tgt_url = (!$keys['src'])?$alt:$keys['src']);
	if ((!preg_match('#^http\:\/\/#', $tgt_url, $null)) && (!preg_match('#^\/#', $tgt_url, $null))) {
		array_push($rdest,'[INVALID IMG BB CODE]');
		continue;
	}

3. Найди аналогичную строку немного ниже (~306 строка) и перед ней также добавь этот код, только "INVALID IMG BB CODE" замени на "INVALID URL BB CODE"

p.s. И фикспак тоже поверх залей. Он не вылечит этой проблемы (кроме оперы никто больше себя так не ведёт), но кое-что он исправлял.

Не в сети

#8 2009-08-17 21:39:06

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Re: Ломанули сайт

vitaly, попробовал на 2-ом компьютере домашнем, там IE он тоже ругается на XSS может от версии браузера ещё что-то зависит ? т.к на новой версии ие такого что-то не видно

В parse.class.php добавил как ты сказал после этого сайт вообще перестал открываться, вот код с добавлением тех строчек:

<?php

//
// Copyright (C) 2006-2008 Next Generation CMS (http://ngcms.ru/)
// Name: parse.class.php
// Description: Parsing and formatting routines
// Author: Vitaly Ponomarev, Alexey Zinchenko
//

// Protect against hack attempts
if (!defined('NGCMS')) die ('HAL');

class parse {
	function slashes($content) {
		return (get_magic_quotes_gpc()) ? $content : addslashes($content);
	}

	function userblocks($content){
		global $config, $lang, $userROW;
		if (!$config['blocks_for_reg']) return $content;
		return preg_replace("#\[hide\]\s*(.*?)\s*\[/hide\]#is", is_array($userROW)?"$1":str_replace("{text}", $lang['not_logged'], $lang['not_logged_html']), $content);
	}


	// Scan URL and normalize it to convert to absolute path
	// Check for XSS
	function normalize_url($url){
		if (((substr($url,0,1) == "\"") && (substr($url,-1,1) == "\""))||
			((substr($url,0,1) == "'")  && (substr($url,-1,1) == "'" ))) {
			$url = substr($url, 1, strlen($url)-2);
		}

		// Check for XSS attack
		$urlXSS = str_replace(array(ord(0), ord(9), ord(10), ord(13), ' ', "'", "\"", ";"),'',$url);
		if (preg_match('/^javascript:/is', $urlXSS)) {
			return false;
		}

		// Add leading "http://" if needed
		if (!preg_match("#^(http|ftp|https|news)\://#i", $url)) {
			$url = "http://".$url;
		}
		return $url;
	}

	// Parse BB-tag params
	function parseBBCodeParams($paramLine){

		// Start scanning
		// State:
		// 0 - waiting for name
		// 1 - scanning name
		// 2 - waiting for '='
		// 3 - waiting for value
		// 4 - scanning value
		// 5 - complete
		$state = 0;
		// 0 - no quotes activated
		// 1 - single quotes activated
		// 2 - double quotes activated
		$quotes = 0;

		$keyName = '';
		$keyValue = '';
		$errorFlag = 0;

		$keys = array();

		for ($sI = 0; $sI < strlen($paramLine); $sI ++) {
			// act according current state
			$x = $paramLine{$sI};

			switch ($state) {
				case 0:  if      ($x == "'") { $quotes = 1; $state = 1; $keyName = '';}
						 else if ($x == "'") { $quotes = 2; $state = 1; $keyName = ''; }
						 else if ((($x >='A')&&($x <='Z'))||(($x >='a')&&($x <='z'))) { $state = 1; $keyName = $x; }
						 break;
				case 1:  if ((($quotes == 1)&&($x == "'"))||(($quotes == 2)&&($x == '"'))) { $quotes = 0; $state=2; }
						 else if ((($x >='A')&&($x <='Z'))||(($x >='a')&&($x <='z'))) { $keyName .= $x; }
						 else if ($x == '=') { $state = 3; }
						 else if (($x == ' ')||($x == chr(9))) { $state = 2; }
						 else { $erorFlag = 1; }
						 break;
				case 2:  if ($x == '=') { $state = 3; }
						 else if (($x == ' ')||($x == chr(9))) { ; }
						 else { $errorFlag = 1; }
						 break;
				case 3:  if      ($x == "'") { $quotes = 1; $state = 4; $keyValue = '';}
						 else if ($x == '"') { $quotes = 2; $state = 4; $keyValue = ''; }
						 else if ((($x >='A')&&($x <='Z'))||(($x >='a')&&($x <='z'))) { $state = 4; $keyValue = $x; }
						 break;
				case 4:  if ((($quotes == 1)&&($x == "'"))||(($quotes == 2)&&($x == '"'))) { $quotes = 0; $state=5; }
						 else if (!$quotes &&  (($x == ' ')||($x == chr(9)))) { $state = 5; }
						 else { $keyValue .= $x; }
						 break;
			}

			// Action in case when scanning is complete
			if ($state == 5) {
				$keys [ strtolower($keyName) ] = $keyValue;
				$state = 0;
			}
		}

		// If we finished and we're in stete "scanning value" - register this field
		if ($state == 4) {
			$keys [ strtolower($keyName) ] = $keyValue;
			$state = 0;
		}

		// If we have any other state - report an error
		if ($state) {
			$errorFlag = 1; // print "EF ($state)[".$paramLine."].";
		}

		if ($errorFlag) {
			return -1;
		}
		return $keys;
	}

	function bbcodes($content) {
		global $lang, $config, $userROW;

		if (!$config['use_bbcodes']) return $content;

		$content	=	preg_replace("#\[code\](.+?)\[/code\]#is", "<pre>$1</pre>",$content);

		$content	=	preg_replace("#\[quote\]\s*(.*?)\s*\[/quote\]#is", "<blockquote><b>".$lang['bb_quote']."</b><br />$1</blockquote>",$content);
		$content	=	preg_replace("#\[quote=(.*?)\]\s*(.*?)\s*\[/quote\]#is","<div class='answer'><b>$1 ".$lang['bb_wrote']."</b><br />$2</div>",$content);

		$content	=	preg_replace("#\[acronym\]\s*(.*?)\s*\[/acronym\]#is", "<acronym>$1</acronym>",$content);
		$content	=	preg_replace("#\[acronym=(.*?)\]\s*(.*?)\s*\[/acronym\]#is","<acronym title=\"$1\">$2</acronym>",$content);

		$content	=	preg_replace("#\[email\]\s*(\S+?)\s*\[/email\]#i", "<a href=\"mailto:$1\">$1</a>", $content);
		$content	=	preg_replace("#\[email\s*=\s*\&quot\;([\.\w\-]+\@[\.\w\-]+\.[\.\w\-]+)\s*\&quot\;\s*\](.*?)\[\/email\]#i", "<a href=\"mailto:$1\">$2</a>", $content);
		$content	=	preg_replace("#\[email\s*=\s*([\.\w\-]+\@[\.\w\-]+\.[\w\-]+)\s*\](.*?)\[\/email\]#i", "<a href=\"mailto:$1\">$2</a>", $content);
		$content	=	preg_replace("#\[s\](.*?)\[/s\]#is", "<s>$1</s>", $content);
		$content	=	preg_replace("#\[b\](.+?)\[/b\]#is", "<b>$1</b>", $content);
		$content	=	preg_replace("#\[i\](.+?)\[/i\]#is", "<i>$1</i>", $content);
		$content	=	preg_replace("#\[u\](.+?)\[/u\]#is", "<u>$1</u>", $content);
		$content	=	preg_replace("#\[p\](.+?)\[/p\]#is", "<p>$1</p>", $content);
		$content	=	preg_replace("#\[ul\](.*?)\[/ul\]#is", "<ul>$1</ul>", $content);
		$content	=	preg_replace("#\[li\](.*?)\[/li\]#is", "<li>$1</li>", $content);
		$content	=	preg_replace("#\[ol\](.*?)\[/ol\]#is", "<ol>$1</ol>", $content);
		$content	=	preg_replace("#\[left\](.*?)\[/left\]#is","<p style=\"text-align: left\">$1</p>", $content);
		$content	=	preg_replace("#\[right\](.*?)\[/right\]#is","<p style=\"text-align: right\">$1</p>", $content);
		$content	=	preg_replace("#\[center\](.*?)\[/center\]#is","<p style=\"text-align: center\">$1</p>", $content);

		// Process spoilers
		$content	=	preg_replace("#\[spoiler\](.*?)\[/spoiler\]#is", '<div class="spoiler"><div class="sp-head" onclick="toggleSpoiler(this.parentNode, this);"><b></b>'.$lang['bb_spoiler'].'</div><div class="sp-body">$1</div></div>', $content);
		$content	=	preg_replace("#\[spoiler=\"(.+?)\"\](.*?)\[/spoiler\]#is", '<div class="spoiler"><div class="sp-head" onclick="toggleSpoiler(this.parentNode, this);"><b></b>$1</div><div class="sp-body">$2</div></div>', $content);

		// Process Images
		// Possible format:
		// '[img' + ( '=' or ' ' ) + URL + flags + ']' + alt + '[/url]'
		// '[img' + flags ']' + url + '[/url]'
		// Allower flags:
		// width
		// height
		// border
		// align: 'left', 'right', 'center'
		// class: anything

		if (preg_match_all("#\[img(\=| *)(.*?)\](.*?)\[\/img\]#is", $content, $pcatch, PREG_SET_ORDER)) {
			$rsrc = array();
			$rdest = array();
			// Scan all IMG tags
			foreach ($pcatch as $catch) {

				// Init variables
				list ($line, $null, $paramLine, $alt) = $catch;
				array_push($rsrc, $line);

				// Check for possible error in case of using "]" within params/url
				// Ex: [url=file[my][super].avi" target="_blank]F[i]LE[/url] is parsed incorrectly
				if ((strpos($alt, ']') !== false) && (strpos($alt, "\"") !== false)) {
					// Possible bracket error. Make deep analysis
					$jline = $paramLine.']'.$alt;
					$brk = 0;
					$jlen = strlen($jline);
					for ($ji = 0; $ji < $jlen; $ji++) {
						if ($jline[$ji] == "\"") {
							$brk = !$brk;
							continue;
						}

						if ((!$brk) && ($jline[$ji] == ']')) {
							// Found correct delimiter
							$paramLine = substr($jline, 0, $ji);
							$alt = substr($jline, $ji+1);
							break;
						}
					}
				}

				$outkeys = array();

				// Make a parametric line with url
				if (trim($paramLine)) {
					// Parse params
					$paramLine = "src=".$paramLine;
					$keys = $this->parseBBCodeParams($paramLine);
				} else {
					// No params to scan
					$keys = array();
				}

				// Return an error if BB code is bad
				if (!is_array($keys)) {
					array_push($rdest,'[INVALID IMG BB CODE]');
					continue;
				}

				$keys['alt'] = $alt;
				
				$tgt_url = (!$keys['src'])?$alt:$keys['src']);
    if ((!preg_match('#^http\:\/\/#', $tgt_url, $null)) && (!preg_match('#^\/#', $tgt_url, $null))) {
        array_push($rdest,'[INVALID IMG BB CODE]');
        continue;
    }
				// Now let's compose a resulting URL
				$outkeys [] = 'src="'.((!$keys['src'])?$alt:$keys['src']).'"';

				// Now parse allowed tags and add it into output line
				foreach ($keys as $kn => $kv) {
					switch ($kn) {
						case 'width':
						case 'height':
						case 'border':
								$outkeys[] = $kn.'="'.intval($kv).'"';
								break;
						case 'align':
							if (in_array(strtolower($kv), array( 'left', 'right', 'middle', 'top', 'bottom')))
								$outkeys[] = $kn.'="'.strtolower($kv).'"';
							break;
						case 'class':
							$v = str_replace(array(ord(0), ord(9), ord(10), ord(13), ' ', "'", "\"", ";", ":", '<', '>', '&'),'',$kv);
							$outkeys [] = $kn.'="'.$v.'"';
							break;
						case 'alt':
							$v = str_replace(array("\"", ord(0), ord(9), ord(10), ord(13), ":", '<', '>', '&'),array("'",''),$kv);
							$outkeys [] = $kn.'="'.$v.'"';
							break;
					}
				}
				// Fill an output replacing array
				array_push($rdest, "<img ".(implode(" ", $outkeys)).' />');
			}
			$content = str_replace($rsrc, $rdest, $content);
		}


		// Process URLS
		// Possible format:
		// '[url' + ( '=' or ' ' ) + URL + flags + ']' + Name + '[/url]'
		// '[url' + flags ']' + url + '[/url]'
		// Allower flags:
		// target: anything
		// class: anything
		// title: anything

		if (preg_match_all("#\[url(\=| *)(.*?)\](.*?)\[\/url\]#is", $content, $pcatch, PREG_SET_ORDER)) {
			$rsrc = array();
			$rdest = array();
			// Scan all URL tags
			foreach ($pcatch as $catch) {

				// Init variables
				list ($line, $null, $paramLine, $alt) = $catch;
				array_push($rsrc, $line);

				// Check for possible error in case of using "]" within params/url
				// Ex: [url=file[my][super].avi" target="_blank]F[i]LE[/url] is parsed incorrectly
				if ((strpos($alt, ']') !== false) && (strpos($alt, "\"") !== false)) {
					// Possible bracket error. Make deep analysis
					$jline = $paramLine.']'.$alt;
					$brk = 0;
					$jlen = strlen($jline);
					for ($ji = 0; $ji < $jlen; $ji++) {
						if ($jline[$ji] == "\"") {
							$brk = !$brk;
							continue;
						}

						if ((!$brk) && ($jline[$ji] == ']')) {
							// Found correct delimiter
							$paramLine = substr($jline, 0, $ji);
							$alt = substr($jline, $ji+1);
							break;
						}
					}
				}

				$outkeys = array();

				// Make a parametric line with url
				if (trim($paramLine)) {
					// Parse params
					$paramLine = "href=".$paramLine;
					$keys = $this->parseBBCodeParams($paramLine);
				} else {
					// No params to scan
					$keys = array();
				}

				// Return an error if BB code is bad
				if (!is_array($keys)) {
					array_push($rdest,'[INVALID URL BB CODE]');
					continue;
				}

               $tgt_url = (!$keys['src'])?$alt:$keys['src']);
    if ((!preg_match('#^http\:\/\/#', $tgt_url, $null)) && (!preg_match('#^\/#', $tgt_url, $null))) {
        array_push($rdest,'[INVALID URL BB CODE]');
        continue;
    }
				// Now let's compose a resulting URL
				$outkeys [] = 'href="'.((!$keys['href'])?$alt:$keys['href']).'"';

				// Now parse allowed tags and add it into output line
				foreach ($keys as $kn => $kv) {
					switch ($kn) {
						case 'class':
						case 'target':
							$v = str_replace(array(ord(0), ord(9), ord(10), ord(13), ' ', "'", "\"", ";", ":", '<', '>', '&'),'',$kv);
							$outkeys [] = $kn.'="'.$v.'"';
							break;
						case 'title':
							$v = str_replace(array("\"", ord(0), ord(9), ord(10), ord(13), ":", '<', '>', '&'),array("'",''),$kv);
							$outkeys [] = $kn.'="'.$v.'"';
							break;
					}
				}
				// Fill an output replacing array
				array_push($rdest, "<a ".(implode(" ", $outkeys)).">".$alt.'</a>');
			}
			$content = str_replace($rsrc, $rdest, $content);
		}

        // Обработка кириллических символов для украинского языка
        $content	=	str_replace(array('[CYR_I]', '[CYR_i]', '[CYR_E]', '[CYR_e]', '[CYR_II]', '[CYR_ii]'), array('І', 'і', 'Є', 'є', 'Ї', 'ї'), $content);

		// Авто-подсветка URL'ов в тексте новости
		$content	=	preg_replace("#(^|\s)((http|https|news|ftp)://\w+[^\s\[\]\<]+)#i", "$1<a href='$2' target='_blank'>$2</a>", $content);

		while (preg_match("#\[color=([^\]]+)\](.+?)\[/color\]#ies", $content)) {
			$content = preg_replace("#\[color=([^\]]+)\](.+?)\[/color\]#ies"  , "\$this->color(array('style'=>'$1','text'=>'$2'))", $content);
		}
		return $content;
	}

	function htmlformatter($content) {
		global $config;

		if (!$config['use_htmlformatter'])
			return $content;

		$content	=	preg_replace('|<br />\s*<br />|', "\n\n", $content);
		$content	=	str_replace(array("\r\n", "\r"), "\n", $content);
		$content	=	preg_replace("/\n\n+/", "\n\n", $content);
		$content	=	preg_replace('/\n/', "<br />", $content);
		$content	=	preg_replace('!<p>\s*(</?(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|math|p|h[1-6])[^>]*>)\s*</p>!', "$1", $content);
		$content	=	preg_replace("|<p>(<li.+?)</p>|", "$1", $content);
		$content	=	preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $content);
		$content	=	str_replace('</blockquote></p>', '</p></blockquote>', $content);
		$content	=	preg_replace('!<p>\s*(</?(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|math|p|h[1-6])[^>]*>)!', "$1", $content);
		$content	=	preg_replace('!(</?(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|math|p|h[1-6])[^>]*>)\s*</p>!', "$1", $content);
		$content	=	preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $content);
		$content	=	preg_replace('!(</?(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|math|p|h[1-6])[^>]*>)\s*<br />!', "$1", $content);
		$content	=	preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)!', '$1', $content);
		$content	=	preg_replace("/<code>(.*?)<\/code>/es", "phphighlight('$1')", $content);
		$content	=	str_replace("\n</p>\n", "</p>", $content);

		return $content;
	}

	function smilies($content) {
		global $config;

		if (!$config['use_smilies'])
			return $content;

		$smilies_arr	=	explode(",", $config['smilies']);
		foreach ($smilies_arr as $null => $smile) {
			$smile		=	trim($smile);
			$find[]		=	"':$smile:'";
			$replace[]	=	"<img class=\"smilies\" alt=\"$smile\" src=\"".skins_url."/smilies/$smile.gif\" />";
		}
		return preg_replace($find, $replace, $content);
	}

	function translit($content, $allowDash = 0) {

		$utf2enS = array('А' => 'a', 'Б' => 'b', 'В' => 'v', 'Г' => 'h', 'Ґ' => 'g', 'Д' => 'd', 'Е' => 'e', 'Ё' => 'jo', 'Є' => 'e', 'Ж' => 'zh', 'З' => 'z', 'И' => 'i', 'І' => 'i', 'Й' => 'i', 'Ї' => 'i', 'К' => 'k', 'Л' => 'l', 'М' => 'm', 'Н' => 'n', 'О' => 'o', 'П' => 'p', 'Р' => 'r', 'С' => 's', 'Т' => 't', 'У' => 'u', 'Ў' => 'u', 'Ф' => 'f', 'Х' => 'h', 'Ц' => 'c', 'Ч' => 'ch', 'Ш' => 'sh', 'Щ' => 'sz', 'Ъ' => '', 'Ы' => 'y', 'Ь' => '', 'Э' => 'e', 'Ю' => 'yu', 'Я' => 'ya');
		$utf2enB = array('а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'ґ' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'jo', 'є' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'і' => 'i', 'й' => 'i', 'ї' => 'i', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ў' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sz', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', '"' => '', '&' => '', 'µ' => 'u', '№' => 'num');

		$content = trim(strip_tags($content));
		$content = strtr($content, $utf2enS);
		$content = strtr($content, $utf2enB);
		$content = preg_replace("/\s+/ms", "_", $content);
		$content = preg_replace("/[ ]+/", "_", $content);

		$cut = ($allowDash)?"/[^a-z0-9_\-\.]+/mi":"/[^a-z0-9_\.]+/mi";
		$content = preg_replace($cut, "", $content);

		return $content;
	}

	function color($arr) {

		$style = $arr['style'];
		$text  = $arr['text'];
		$style = str_replace('"', '', $style);
		$style = preg_replace("/[&\(\)\.\%\[\]<>\'\"]/", "", preg_replace( "#^(.+?)(?:;|$)#", "$1", $style ));
		$style = preg_replace("/[^\d\w\#\s]/s", "", $style);

		return "<span style=\"color:".$style."\">".$text."</span>";
	}

	// Functions for HTML truncator
	function joinAttributes($attributes){
		$alist = array();
		foreach ($attributes as $aname => $aval) {
			$mark = (strpos($aval, '"') === FALSE)?'"':"'";
			$alist [] = $aname.'='.$mark.$aval.$mark;
		}
		return join(" ", $alist);
	}

	function truncateHTML ( $text, $size = 50, $finisher = '...' ) {

		$len = strlen($text);

		if ($len <= $size)
			return $text;

		$textLen = 0;
		$position  = -1;
		$tagNameStartPos = 0;
		$tagNameEndPos = 0;
		$openTagList = array();

		// Stateful machine status
		// 0 - scanning text
		// 1 - scanning tag name
		// 2 - scanning tag content
		// 3 - scanning tag attribute value
		// 4 - waiting for tag close mark
		$state = 0;

		// 0 - no quotes active
		// 1 - single quotes active
		// 2 - double quotes active
		$quoteType = 0;

		// Flag if 'tag close symbol' is used
		$closeFlag = 0;

		while ((($position+1) < $len) && ($textLen < $size)) {
			$position++;
			$char = $text{$position};
		//	printf("%03u[%u][%03u][%02u] %s\n", $position, $state, $textLen, count($openTagList), $char);

			switch ($state) {
				// Scanning text
				case 0:
					// '<' - way to starting tag
					if ($char == '<') {
						$state = 1;
						$tagNameStartPos = $position+1;
						continue;
					}
					$textLen++;

					break;
				case 1:
					// If this is a space/tab - tag name is finished
					if (($char == ' ')||($char == "\t")) {
						$tagNameLen = $position - $tagNameStartPos;
						$state = 2;
						continue;
					}

					// Activity on tag close flag
					if ($char == '/') {
						if ($tagNameStartPos == $position)
							continue;

						$tagNameLen = $position - $tagNameStartPos + 1;
						$state = 4;
						continue;
					}

					// Action on tag closing
					if ($char == '>') {
						$tagNameLen = $position - $tagNameStartPos;
						$tagName = substr($text, $tagNameStartPos, $tagNameLen);
				//		print "openTag[1]: $tagName\n";

						// Closing tag
						if ($tagName{0} == '/') {
							if ((count($openTagList)) && ($openTagList[count($openTagList)-1] == substr($tagName, 1)))
								array_pop($openTagList);
						} else {
							// Opening tag
							if (substr($tagName, -1, 1) != '/') {
								// And not closed at the same time
								array_push($openTagList, $tagName);
							}
						}
						$state = 0;
						continue;
					}

					// Tag name may contain only english letters
					if (!((($char >= 'A') && ($char <= 'Z')) || (($char >= 'a') && ($char <= 'z')))) {
						$state = 0;
						continue;
					}
					break;
				case 2:
					// Activity on tag close flag
					if ($char == '/') {
						$state = 4;
						continue;
					}

					// Action on tag closing
					if ($char == '>') {
						$tagName = substr($text, $tagNameStartPos, $tagNameLen);
				//		print "openTag: $tagName\n";

						// Closing tag
						if ((count($openTagList)) && ($openTagList[count($openTagList)-1] == substr($tagName, 1))) {
							if ($openTagList[count($openTagList)] == substr($tagName, 1))
								array_pop($openTagList);
						} else {
							// Opening tag
							if (substr($tagName, -1, 1) != '/') {
								// And not closed at the same time
								array_push($openTagList, $tagName);
							}
						}
						$state = 0;
						continue;
					}

					// Action on quote
					if (($char == '"')||($char == "'")) {
						$quoteType = ($char == '"')?2:1;
						$state = 3;
						continue;
					}
					break;
				case 3:
					// Act only on quote
					if ((($char == '"') && ($quoteType == 2)) || (($char == "'") && ($quoteType == 1))) {
						$state = 2;
						continue;
					}
					break;
				case 4:
					// Only spaces or tag close mark is accepted
					if (($char == ' ') || ($char == "\t")) {
						continue;
					}

					if ($char == '>') {
						$tagName = substr($text, $tagNameStartPos, $tagNameLen);
			//			print "openTag: $tagName\n";

						// Closing tag
						if ($tagName{0} != '/') {
							if ((count($openTagList)) && ($openTagList[count($openTagList)-1] == substr($tagName, 1)))
								array_pop($openTagList);
						} else {
							// Opening tag
							if (substr($tagName, -1, 1) != '/') {
								// And not closed at the same time
								array_push($openTagList, $tagName);
							}
						}
						$state = 0;
						continue;
					}

					// Wrong symbol [ this is wholy text ]
					$state = 0;
					break;
			}
		}

		$output = substr($text, 0, $position+1) . ((($position+1) != $len)?$finisher:'');

		// Check if we have opened tags
		while ($tag = array_pop($openTagList))
			$output .= "</".$tag.">";

		return $output;
	}
}

Изменено zheka (2009-08-17 22:44:40)

Не в сети

#9 2009-08-17 22:29:18

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: Ломанули сайт

Сорри, ошибся со скобками.
Исправил своё исходное сообщение.

Не в сети

#10 2009-08-17 22:46:48

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Re: Ломанули сайт

vitaly, что-то упорно не хочет работать, после замены выдаёт чистый лист, я поправил своё сообщение с кодом выше, посмотри как теперь там...
Вообще на сколько опасна данная штука что он проделал с сайтом ?

Изменено zheka (2009-08-17 22:47:24)

Не в сети

#11 2009-08-17 23:22:01

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: Ломанули сайт

Блин... странно sad(
Для сайта - опасности ноль.
Для посетителей - есть возможность украсть их куки.

Кто-то тебе "внедрил" JS код в страничку.
Двиг этот код подпортил, чтобы отображался он корректно, но при этом уже не работал.
Почему опера захотела его исполнить - не понимаю.. остальные браузеры этим не страдают.

Не в сети

#12 2009-08-18 07:32:56

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Re: Ломанули сайт

vitaly, так что теперь мне делать ?

Не в сети

#13 2009-08-18 09:56:45

infinity237
Модератор
Откуда Russia, Moscow
Зарегистрирован: 2008-11-09
Сообщений: 2,674
Рейтинг :   176 
Сайт

Re: Ломанули сайт

Подобная тема вроде была здесь.
Т.е фактически, лучше удалить все комментарии пользователя с этим ником, и забанить его по ip через .htaccess (хотя если юзался прокси врятли это сильно поможет), примерно так:

Order allow,deny
Allow from All
Deny from 172.16.32.64

Ну а на будущее, нужно будет обновится с 0.9.0 до 0.9.1, когда выйдет финальная версия.

P.S. Идея стара как мир.

Изменено infinity237 (2009-08-18 10:04:55)

Не в сети

#14 2009-08-18 10:25:24

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Re: Ломанули сайт

Понятно, т.е. эту багу с XSS в данной версии мне ни как не победить ? По поводу урезания комментариев это вариант, однако сразу отпадает т.к. не совсем корректно срабатывает... Получается остаётся ждать 0.9.1 финальный релиз ? smile

Не в сети

#15 2009-08-18 11:29:15

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: Ломанули сайт

zheka, наипростейший способ - запретить img/url для комментов smile
А вообще мой патч должен был сработать. Дай доступ к хостингу, посмотрю что там и поставлю патч. может я где опечатался в своём примере...

Не в сети

#16 2009-08-18 13:33:31

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Re: Ломанули сайт

vitaly пишет:

zheka, наипростейший способ - запретить img/url для комментов smile
А вообще мой патч должен был сработать. Дай доступ к хостингу, посмотрю что там и поставлю патч. может я где опечатался в своём примере...

Как можно запретить img/url для комментов ?
Доступ я бы дал, но у нас доступ к этому хостингу только из локальной сети, чужие ип не пускает (( может быть попробуешь сам отредактировать этот файл и выложить код тут, я все сделал в точности как ты сказал. P.S. или могу дать доступ через удалённый рабочий стол на мой сервер, с него сможешь попасть на этот хостинг, такой вариант устроит ?

Не в сети

#17 2009-08-18 16:24:37

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: Ломанули сайт

Давай доступ к Remote Desktop. Так всё-равно проще намного.

Не в сети

#18 2009-08-18 16:51:13

zheka
Участник
Зарегистрирован: 2008-10-13
Сообщений: 98
Рейтинг :   

Re: Ломанули сайт

vitaly пишет:

Давай доступ к Remote Desktop. Так всё-равно проще намного.

Выслал в ЛС, напиши как сделаешь smile

Не в сети

Подвал раздела

Работает на FluxBB