Вы не зашли.
Почти адаптировал шаблон, но некоторые баги не смог исправить:
1. Не работает авторизация, после ввода имени и пароля в меню пользователя, выбрасывает на главную страницу, файлы usermenu.tpl и login.tpl поправил в точности по инструкции, правда login.tpl взял из стандартной поставки, "разлогин" работает нормально, залогиниться можно, только если зайти в админку и потом перейти на главную страницу сайта.
2. Умерла капча, появляется только рамка от от защитного когда, самого кода нет, см.скрин
3. После регистрации не появляется сообщение "Спасибо за регистрацию" хотя регистрация проходит нормально.
4. И небольшой баг в профиле, не отображаются некоторые надписи, см. скрин
Как это можно поправить ? Особенно интересует вопрос с авторизацией...
vitaly, какая-нибудь инструкция по адаптации своих шаблонов есть ?
Давай доступ к Remote Desktop. Так всё-равно проще намного.
Выслал в ЛС, напиши как сделаешь
zheka, наипростейший способ - запретить img/url для комментов
А вообще мой патч должен был сработать. Дай доступ к хостингу, посмотрю что там и поставлю патч. может я где опечатался в своём примере...
Как можно запретить img/url для комментов ?
Доступ я бы дал, но у нас доступ к этому хостингу только из локальной сети, чужие ип не пускает (( может быть попробуешь сам отредактировать этот файл и выложить код тут, я все сделал в точности как ты сказал. P.S. или могу дать доступ через удалённый рабочий стол на мой сервер, с него сможешь попасть на этот хостинг, такой вариант устроит ?
Понятно, т.е. эту багу с XSS в данной версии мне ни как не победить ? По поводу урезания комментариев это вариант, однако сразу отпадает т.к. не совсем корректно срабатывает... Получается остаётся ждать 0.9.1 финальный релиз ?
vitaly, так что теперь мне делать ?
vitaly, что-то упорно не хочет работать, после замены выдаёт чистый лист, я поправил своё сообщение с кодом выше, посмотри как теперь там...
Вообще на сколько опасна данная штука что он проделал с сайтом ?
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;
}
}
Проверяю у себя на IE не срабатывает такое, знакомый проверяет на своём компьютере на IE у него срабатывает, проверили на FireFox тоже не срабатывает, на опере срабатывает. вот такие дела...
Тебе ведь в таком виде комментарий оставили?
Попробовал только что - не получается.И обновись именно до последней версии - к 0.9.0 было ещё несколько FixPack'ов, последний доступен тут
Да именно в таком, ты вот сейчас написал и у меня по крайней мере на опере выскочило опять сообщение о XSS
Мне надо поверх всего залить только FixPack #04 по твоей ссылке ?
URL?
И проверь, стоит ли у тебя последний FixPack.
Стоит [15.11.2008] 0.9.0 Release
URL сейчас отправлю в личку, правда то сообщение которое:
[img]javascript:alert('XSS')[/img]
я в двух местах удалил, теперь то сообщение не выскакивает, но это не решает проблему как-то же он это провернул и где-то в коде факт оставил ещё следы...
Ну вот и случилось, ломанули меня = ) Собственно вопрос где латать дыру, при заходе на сайт выскакивает сообщение JavaScrip, два сообщения:
1-ое
XSS
жмём ок, далее
2-ое
XaсKed by...
в сообщениях в комментариях нашёл текст написанный им
[img]javascript:alert('XSS')[/img]
Где-то уязвимость XSS, собственно вопрос как это дело залатать ?
Стоит 0.9.0 Release
vitaly, в блокировке IP-адресов, будет ли когда доступна функция которая полностью перекрывает доступ на сайт, которая в данный момент есть, но не активна ?
Так что-то изменилось в истории создания данного плагина ? Будет ли он выложен хоть в каком-то виде ?
Всем спасибо за помощь, но теперь возникла какая-то странная проблема, сделал как написал insider Иногда происходит какой-то глюк незарегистрированные пользователи при написании комментариев попадают в группу Администратор, см. скрин во вложении. Как можно это поправить ?
Подскажите как сделать чтобы в шаблоне comments.show.tpl работали параметры которые отображают статус пользователя Администратор, редактор итд.. которые {l_status} и {status} из шаблона users.tpl Спасибо = )
Заметил какую-то странную вещь... например пишу я комментарий, написал, отправил
вижу: Рейтинг: {plugins_user_ranks}
обновляю страничку
вижу: Рейтинг: Новичок
В чём может быть проблема ?
Сойри за ламерский вопрос Может кто подскажет как сделать чтобы при открытии главной страницы моего сайта воспроизводился определённый мп3 файл каторый лежит на хостинге, желательно чтобы это было только для главной страницы и не срабатывало в категориях, чтобы музыка сработала только один раз и не играла потом по 100 раз ) Как такое можно реализовать ?
vitaly, спасибо за долгожданный плагин, а то эти сторонние разработки совсем никудышные )
Хотелось бы ещё видеть на этом этапе какую-то модерацию в чате, хотя бы простое удаление сообщений )
Может кому пригодиться делается это так, в php файле плагина заменяем в 53 строке
'.$row[tid].'" title="'.$row[description].'">
на
'.$row[tid].'&view=getnewpost" title="'.$row[description].'">
Кто-нибудь знает, возможно ли в данном плагине сделать так чтобы при переходе по отображаемой ссылке автоматически открывалась последняя страница темы форума с последним сообщением, а то сейчас открывается первая. Можно ли такое сделать?
По поводу конкурсов хорошая идея, особенно тех в которых пользователи окажут помощь проекту например как и говорилось выше в поиске багов в новых релизах...
ROZARD, Сейчас только всё проверил работает как надо, спасибо за помощь вопрос исчерпан, респект и уважуха тебе
ROZARD, ага всё верно ) просто я по привычке новости через админ-панель добавляю и вот что странно, если нажать кнопку добавить новость, а потом дополнительно, параметры (Опубликовать, Отобразить на главной, Разрешить комментарии итд.. ) есть. А если проделать тоже самое через админку, то там такое поле вообще скрыто, т.о надпись Дополнительно есть а внизу параметров нету... или так и должно быть? Просто хотелось бы чтобы у журналиста были такие же опции как у редактора только на свои новости через админ панель ( массовое удаление новостей итд.. )
ROZARD, нужно чтобы журналист при редактировании своей новости видел блок дополнительно (Опубликовать, Отобразить на главной, Разрешить комментарии, Добавить в закладки, Прикрепить, Отключить автоформатирование, Разрешить использовать HTML теги ) чтобы сам мог выставить нужные ему параметры, сейчас это меню скрыто... Странно, я так же отредактировал фаил www\engine\actions\addnews.php, но почему-то новости не публикуются, т.о надо подтверждать админу, проверял на денвере.