<MyRusakov.ru />

Профессия Web-разработчик

Профессия Web-разработчик

Этот комплект за 8 месяцев превратит Вас в Web-разработчика с нуля. Учиться достаточно 1 час в день.

Начнёте Вы с HTML, CSS и вёрстки сайтов. Потом перейдёте к программированию и JavaScript. Затем изучите PHP, MySQL, SQL, Python. Изучите Web-фреймворки Laravel и Django. Создадите 5 своих сайтов для портфолио.

Комплект содержит:

- 540 видеоуроков

- 110 часов видео

- 1205 заданий для закрепления материала из уроков

- 5 финальных тестов

- 7 сертификатов

- 12 Бонусных курсов

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Форум сайта MyRusakov.ru

Класс бб-кодов
24.11.2012 18:27:46 Класс бб-кодов Сообщение #1
malina95

malina95

Мастер

Мастер

Дата регистрации:
15.07.2012 07:13:44

Сообщений: 208

Здравствуйте, я тут наткнулся на класс для преобразований бб-кодов.

Вот он собственно:

class bbcode {
public function bbcode2html($message, $is_cut = 1) {
$preg = array(
'/(?<!\\\\)\[color(?::\w+)?=(.*?)\](.*?)\[\/color(?::\w+)?\]/si' => "<span style=\"color:\\1\">\\2</span>",
'/(?<!\\\\)\[size(?::\w+)?=(.*?)\](.*?)\[\/size(?::\w+)?\]/si' => "<span style=\"font-size:\\1\">\\2</span>",
'/(?<!\\\\)\[font(?::\w+)?=(.*?)\](.*?)\[\/font(?::\w+)?\]/si' => "<span style=\"font-family:\\1\">\\2</span>",
'/(?<!\\\\)\[align(?::\w+)?=(.*?)\](.*?)\[\/align(?::\w+)?\]/si' => "<div style=\"text-align:\\1\">\\2</div>",
'/(?<!\\\\)\[b(?::\w+)?\](.*?)\[\/b(?::\w+)?\]/si' => "<span style=\"font-weight:bold\">\\1</span>",
'/(?<!\\\\)\[i(?::\w+)?\](.*?)\[\/i(?::\w+)?\]/si' => "<span style=\"font-style:italic\">\\1</span>",
'/(?<!\\\\)\[u(?::\w+)?\](.*?)\[\/u(?::\w+)?\]/si' => "<span style=\"text-decoration:underline\">\\1</span>",
'/(?<!\\\\)\[center(?::\w+)?\](.*?)\[\/center(?::\w+)?\]/si' => "<div style=\"text-align:center\">\\1</div>",
// [cut]
'/(?<!\\\\)\[cut(?::\w+)?\](.*?)\[\/cut(?::\w+)?\]/si' => "\\1",
// [code] & [sql]
'/(?<!\\\\)\[sql(?::\w+)?\](.*?)\[\/sql(?::\w+)?\]/sie' => "highlight_sql('\\1');",
'/(?<!\\\\)\[code(?::\w+)?\](.*?)\[\/code(?::\w+)?\]/sie' => "highlight_code('\\1');",
'/(?<!\\\\)\[php(?::\w+)?\](.*?)\[\/php(?::\w+)?\]/ise' => "highlight_php('\\1');",
// [email]
'/(?<!\\\\)\[email(?::\w+)?\](.*?)\[\/email(?::\w+)?\]/si' => "<a href=\"mailto:\\1\" class=\"bb-email\">\\1</a>",
'/(?<!\\\\)\[email(?::\w+)?=(.*?)\](.*?)\[\/email(?::\w+)?\]/si' => "<a href=\"mailto:\\1\" class=\"bb-email\">\\2</a>",
// [url]
'/(?<!\\\\)\[url(?::\w+)?\]www\.(.*?)\[\/url(?::\w+)?\]/si' => "<a href=\"http://www.\\1\" target=\"_blank\" class=\"bburl\">\\1</a>",
'/(?<!\\\\)\[url(?::\w+)?\](.*?)\[\/url(?::\w+)?\]/si' => "<a href=\"\\1\" target=\"_blank\" class=\"bb-url\">\\1</a>",
'/(?<!\\\\)\[url(?::\w+)?=(.*?)?\](.*?)\[\/url(?::\w+)?\]/si' => "<a href=\"\\1\" target=\"_blank\" class=\"bb-url\">\\2</a>",
// [img]
'/(?<!\\\\)\[img(?::\w+)?\](.*?)\[\/img(?::\w+)?\]/si' => "<img src=\"\\1\" alt=\"\\1\" class=\"bb-image\" />",
'/(?<!\\\\)\[img(?::\w+)?=(.*?)x(.*?)\](.*?)\[\/img(?::\w+)?\]/si' => "<img width=\"\\1\" height=\"\\2\" src=\"\\3\" alt=\"\\3\"class=\"bb-image\" />",
// [quote]
'/(?<!\\\\)\[quote(?::\w+)?\](.*?)\[\/quote(?::\w+)?\]/si' => "<div>Quote:<div class=\"bb-quote\">\\1</div></div>",
'/(?<!\\\\)\[quote(?::\w+)?=(?:&quot;|"|\')?(.*?)["\']?(?:&quot;|"|\')?\](.*?)\[\/quote\]/si' => "<div>Quote \\1:<div class=\"bb-quote\">\\2</div></div>",
// [list]
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\*(?::\w+)?\](.*?)(?=(?:\s*<br\s*\/?>\s*)?\[\*|(?:\s*<br\s*\/?>\s*)?\[\/?list)/si' => "\n<li class=\"bb-listitem\">\\1</li>",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list(?!u|o)\w+)?\](?:<br\s*\/?>?/si' => "\n</ul>",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list:u(:\w+)?\](?:<br\s*\/?>?/si' => "\n</ul>",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list:o(:\w+)?\](?:<br\s*\/?>?/si' => "\n</ol>",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?!u|o)\w+)?\]\s*(?:<br\s*\/?>?/si' => "\n<ul class=\"bb-list-unordered\">",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list:u(:\w+)?\]\s*(?:<br\s*\/?>?/si' => "\n<ul class=\"bb-list-unordered\">",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list:o(:\w+)?\]\s*(?:<br\s*\/?>?/si' => "\n<ol class=\"bb-list-ordered\">",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=1\]\s*(?:<br\s*\/?>?/si' => "\n<ol class=\"bb-list-ordered,bb-listordered-d\">",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=i\]\s*(?:<br\s*\/?>?/s' => "\n<ol class=\"bb-list-ordered,bb-listordered-lr\">",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=I\]\s*(?:<br\s*\/?>?/s' => "\n<ol class=\"bb-list-ordered,bb-listordered-ur\">",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=a\]\s*(?:<br\s*\/?>?/s' => "\n<ol class=\"bb-list-ordered,bb-listordered-la\">",
'/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=A\]\s*(?:<br\s*\/?>?/s' => "\n<ol class=\"bb-list-ordered,bb-listordered-ua\">",
// escaped tags like \[b], \[color], \[url], ...
'/\\\\(\[\/?\w+(?::\w+)*\])/'=> "\\1";
if ($is_cut == 1) {$preg['/(?<!\\\\)\[cut(?::\w+)?\](.*?)\[\/cut(?::\w+)?\]/si']='';}
$message = preg_replace(array_keys($preg), array_values($preg), $message);
return $message;
}

public function highlight_php($str) {
$tags_exists = true;
$res = htmlspecialchars($str);
$res = str_replace(array('&lt;?php', '&lt;?', '?&gt;', '-&gt;', '=&gt'), array('<?php', '<?', '?>', '->', '=>'), $res);
if (strpos('<?', $res) === false) {
$res = '<?php '.$res.' ?>';
$tags_exists = false;
}
$res = '<code class="code">'.highlight_string($res, true).'</code>';
if (!$tags_exists) {
$res = str_replace(array('&lt;?php', '&lt;?', '?&gt;', '<br/>'), array('', '', '', ''), $res);
}
return $res;
}

public function highlight_code($str) {
$res = '<code class="code">'.htmlspecialchars($str).'</code>';
return $res;
}

public function highlight_sql($str) {
$words = array('add', 'auto_increment', 'all', 'alter', 'analyze', 'and',
'as', 'asc', 'before', 'between', 'bigint', 'binary', 'blob',
'both', 'by', 'cascade', 'case', 'change', 'character', 'check', 'collate',
'column', 'columns', 'constraint', 'convert', 'create', 'cross', 'current_date',
'current_time', 'current_timestamp', 'current_user', 'database', 'databases', 'day_hour',
'day_microsecond', 'day_minute', 'day_second', 'dec', 'decimal', 'default', 'delayed',
'delete', 'desc', 'describe', 'distinct', 'distinctrow', 'div',
'double', 'drop', 'dual', 'else', 'enclosed', 'escaped', 'exists',
'explain', 'false', 'fields', 'float', 'float4', 'float8', 'for',
'force', 'foreign', 'from', 'fulltext', 'grant', 'group', 'having',
'high_priority', 'hour_microsecond', 'hour_minute', 'hour_second',
'if', 'ignore', 'in', 'index', 'infile', 'inner', 'insert', 'int',
'int1', 'int2', 'int3', 'int4', 'int8', 'integer', 'interval',
'into', 'is', 'join', 'key', 'keys', 'kill', 'leading', 'minute_second',
'left', 'like', 'limit', 'lines', 'load', 'localtime', 'mod',
'localtimestamp', 'lock', 'long', 'longblob', 'longtext', 'low_priority',
'match', 'mediumblob', 'mediumint', 'mediumtext', 'middleint', 'minute_microsecond',
'natural', 'not', 'no_write_to_binlog', 'null', 'numeric', 'on',
'optimize', 'option', 'optionally', 'or', 'order', 'outer',
'outfile', 'precision', 'primary', 'privileges', 'procedure',
'purge', 'raid0', 'read', 'real', 'references', 'regexp', 'rename',
'replace', 'require', 'restrict', 'revoke', 'right', 'rlike',
'second_microsecond', 'select', 'separator', 'set', 'show', 'smallint',
'soname', 'spatial', 'sql_big_result', 'sql_calc_found_rows',
'sql_small_result', 'ssl', 'starting', 'straight_join', 'table', 'tables',
'terminated', 'then', 'tinyblob', 'tinyint', 'tinytext', 'text', 'to',
'trailing', 'true', 'union', 'unique', 'unlock', 'unsigned', 'update',
'usage', 'use', 'using', 'utc_date', 'utc_time', 'utc_timestamp',
'values', 'varbinary', 'varcharacter', 'varchar', 'varying', 'when', 'where',
'with', 'write', 'x509', 'xor', 'year_month', 'zerofill',
'char');

foreach ($words as $word) {
$patterns[] = '/\b'.$word.'\b/i';
$WORDS[] = '<span class="bb-sql-word">'.strtoupper($word).'</span>';
}

$res = '<code class="code">'.preg_replace($patterns, $WORDS, $str).'</code>';
return $res;
}
}


Дело в том что если я заношу в базу уже с преобразованиями > на &lt; то при выходе опять же проебразуется обратно и получается ерунда... Если я уберу в классе проебразования а именно в функции highlight_php то выдаёт какую-то ошибку в классе, как бы его переделать так чтобы всё было нормально? Я обращаюсь к знающим ООП или начинающим его изучать... Он мне понравился тем что подсвечивает весь код какой бы он нибыл, но веть если в базу заносить без htmlspecialchars то вполне возможен взлом, как поступить в этой ситуации?
Профиль
26.11.2012 16:20:13 Класс бб-кодов Сообщение #2
mischa.samolkaev

mischa.samolkaev

Продвинутый

Продвинутый

Дата регистрации:
12.07.2012 13:00:02

Сообщений: 74

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