Вы не зашли.
Страницы 1
Ну вот и случилось, ломанули меня = ) Собственно вопрос где латать дыру, при заходе на сайт выскакивает сообщение JavaScrip, два сообщения:
1-ое
XSS
жмём ок, далее
2-ое
XaсKed by...
в сообщениях в комментариях нашёл текст написанный им
[img]javascript:alert('XSS')[/img]
Где-то уязвимость XSS, собственно вопрос как это дело залатать ?
Стоит 0.9.0 Release
Не в сети
URL?
И проверь, стоит ли у тебя последний FixPack.
Стоит [15.11.2008] 0.9.0 Release
URL сейчас отправлю в личку, правда то сообщение которое:
[img]javascript:alert('XSS')[/img]
я в двух местах удалил, теперь то сообщение не выскакивает, но это не решает проблему как-то же он это провернул и где-то в коде факт оставил ещё следы...
Изменено zheka (2009-08-17 20:53:29)
Не в сети
Не в сети
Тебе ведь в таком виде комментарий оставили?
Попробовал только что - не получается.И обновись именно до последней версии - к 0.9.0 было ещё несколько FixPack'ов, последний доступен тут
Да именно в таком, ты вот сейчас написал и у меня по крайней мере на опере выскочило опять сообщение о XSS
Мне надо поверх всего залить только FixPack #04 по твоей ссылке ?
Не в сети
Проверяю у себя на IE не срабатывает такое, знакомый проверяет на своём компьютере на IE у него срабатывает, проверили на FireFox тоже не срабатывает, на опере срабатывает. вот такие дела...
Изменено zheka (2009-08-17 21:31:16)
Не в сети
О как. Похоже, это "оригинальная" особенность оперы (у меня у самого 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. И фикспак тоже поверх залей. Он не вылечит этой проблемы (кроме оперы никто больше себя так не ведёт), но кое-что он исправлял.
Не в сети
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*\"\;([\.\w\-]+\@[\.\w\-]+\.[\.\w\-]+)\s*\"\;\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)
Не в сети
vitaly, что-то упорно не хочет работать, после замены выдаёт чистый лист, я поправил своё сообщение с кодом выше, посмотри как теперь там...
Вообще на сколько опасна данная штука что он проделал с сайтом ?
Изменено zheka (2009-08-17 22:47:24)
Не в сети
Блин... странно (
Для сайта - опасности ноль.
Для посетителей - есть возможность украсть их куки.
Кто-то тебе "внедрил" JS код в страничку.
Двиг этот код подпортил, чтобы отображался он корректно, но при этом уже не работал.
Почему опера захотела его исполнить - не понимаю.. остальные браузеры этим не страдают.
Не в сети
Подобная тема вроде была здесь.
Т.е фактически, лучше удалить все комментарии пользователя с этим ником, и забанить его по 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)
Не в сети
Понятно, т.е. эту багу с XSS в данной версии мне ни как не победить ? По поводу урезания комментариев это вариант, однако сразу отпадает т.к. не совсем корректно срабатывает... Получается остаётся ждать 0.9.1 финальный релиз ?
Не в сети
zheka, наипростейший способ - запретить img/url для комментов
А вообще мой патч должен был сработать. Дай доступ к хостингу, посмотрю что там и поставлю патч. может я где опечатался в своём примере...
Не в сети
zheka, наипростейший способ - запретить img/url для комментов
А вообще мой патч должен был сработать. Дай доступ к хостингу, посмотрю что там и поставлю патч. может я где опечатался в своём примере...
Как можно запретить img/url для комментов ?
Доступ я бы дал, но у нас доступ к этому хостингу только из локальной сети, чужие ип не пускает (( может быть попробуешь сам отредактировать этот файл и выложить код тут, я все сделал в точности как ты сказал. P.S. или могу дать доступ через удалённый рабочий стол на мой сервер, с него сможешь попасть на этот хостинг, такой вариант устроит ?
Не в сети
Страницы 1