И вот незнаю как фильтрировать даные после отправки этой штукой
Понятно что mysql_real_escape_string, а вот что делать с яваскриптами?
Так как использовать htmlpecialchars нельзя(зачем тогда вообще этот редактор) то постает вопрос: как полностью защититься от дыр?
Спустя 7 минут, 27 секунд (21.03.2010 - 12:47) glock18 написал(а):
читай про xss: экранирование символов - лишь один из способов защиты. самый простой и действенный. на случай, если теги нужны, есть тоже варианты. правда учитывая кучи багов браузеров, в особенности ie6, не могу сказать, что найти 100% эффективный способ вообще возможно.
Спустя 3 минуты, 41 секунда (21.03.2010 - 12:51) Romms написал(а):
glock18, про XSS я читал... я думаю что нужно фильтрировать <script(.*?)/script> Но наверное єтого мало...
Спустя 3 минуты, 25 секунд (21.03.2010 - 12:54) Nikitian написал(а):
Пользуйтесь:
Ну и кучка других полезных функций для работы с текстом
strip_tags_smart()
<?php
/**
* Более продвинутый аналог strip_tags() для корректного вырезания тагов из html кода.
* Функция strip_tags(), в зависимости от контекста, может работать не корректно.
* Возможности:
* - корректно обрабатываются вхождения типа "a < b > c"
* - корректно обрабатывается "грязный" html, когда в значениях атрибутов тагов могут встречаться символы < >
* - корректно обрабатывается разбитый html
* - вырезаются комментарии, скрипты, стили, PHP, Perl, ASP код, MS Word таги, CDATA
* - автоматически форматируется текст, если он содержит html код
* - защита от подделок типа: "<<fake>script>alert('hi')</</fake>script>"
*
* @param string $s
* @param array $allowable_tags Массив тагов, которые не будут вырезаны
* @param bool $is_format_spaces Форматировать пробелы и переносы строк?
* Вид текста на выходе (plain) максимально приближеется виду текста в браузере на входе.
* Другими словами, грамотно преобразует text/html в text/plain.
* Текст форматируется только в том случае, если были вырезаны какие-либо таги.
* @param array $pair_tags массив имён парных тагов, которые будут удалены вместе с содержимым
* см. значения по умолчанию
* @param array $para_tags массив имён парных тагов, которые будут восприниматься как параграфы (если $is_format_spaces = true)
* см. значения по умолчанию
* @return string
*
* @license http://creativecommons.org/licenses/by-sa/3.0/
* @author Nasibullin Rinat, http://orangetie.ru/
* @charset ANSI
* @version 4.0.12
*/
function strip_tags_smart(
/*string*/ $s,
array $allowable_tags = array('a','img','div','li','ol','ul','table','tr','td','th','hr','b','strong','span','i','u','strike','small','font','center','h1','h2','h3','h4','h5','h6','nobr','p','br','embed','param','object','blockquote'),
/*boolean*/ $is_format_spaces = true,
array $pair_tags = array('script', 'style', 'map', 'iframe', 'frameset', 'applet', 'comment', 'button', 'textarea', 'select'),
array $para_tags = array('title')
)
{
//return strip_tags($s);
static $_callback_type = false;
static $_allowable_tags = array();
static $_para_tags = array();
#regular expression for tag attributes
#correct processes dirty and broken HTML in a singlebyte or multibyte UTF-8 charset!
static $re_attrs_fast_safe = '(?![a-zA-Z\d]) #statement, which follows after a tag
#correct attributes
(?>
[^>"\']+
| (?<=[\=\x20\r\n\t]|\xc2\xa0) "[^"]*"
| (?<=[\=\x20\r\n\t]|\xc2\xa0) \'[^\']*\'
)*
#incorrect attributes
[^>]*+';
if (is_array($s))
{
if ($_callback_type === 'strip_tags')
{
$tag = strtolower($s[1]);
if($_allowable_tags && (array_key_exists($tag, $_allowable_tags) || array_key_exists('<' . trim(strtolower($s[0]), '< />') . '>', $_allowable_tags)))return $s[0];
if($tag === 'br')return "\r\n";
if($_para_tags && array_key_exists($tag, $_para_tags))return "\r\n\r\n";
return '';
}
trigger_error('Unknown callback type "' . $_callback_type . '"!', E_USER_ERROR);
}
if(($pos = strpos($s, '<')) === false || strpos($s, '>', $pos) === false) #speed improve
{
#tags are not found
return $s;
}
$length = strlen($s);
#unpaired tags (opening, closing, !DOCTYPE, MS Word namespace)
$re_tags = '/ <[\/\!]?+
(
[a-zA-Z][a-zA-Z\d]*+
(?>\:[a-zA-Z][a-zA-Z\d]*+)?
)
' . $re_attrs_fast_safe . '
>
/sxSX';
$patterns = array(
'/<([\?\%]) .*? \\1>/sxSX', #встроенный PHP, Perl, ASP код
'/<\!\[CDATA\[ .*? \]\]>/sxSX', #блоки CDATA
#'/<\!\[ [\x20\r\n\t]* [a-zA-Z] .*? \]>/sxSX', #:DEPRECATED: MS Word таги типа <![if! vml]>...<![endif]>
// '/<\!--.*?-->/sSX', #комментарии
#MS Word таги типа "<![if! vml]>...<![endif]>",
#условное выполнение кода для IE типа "<!--[if expression]> HTML <![endif]-->"
#условное выполнение кода для IE типа "<![if expression]> HTML <![endif]>"
#см. http://www.tigir.com/comments.htm</span>
'/ <\! (?:--)?+
\[
(?> [^\]"\']+ | "[^"]*" | \'[^\']*\' )*
\]
(?:--)?+
>
/sxSX',
);
if($pair_tags)
{
#парные таги вместе с содержимым:
foreach ($pair_tags as $k => $v) $pair_tags[$k] = preg_quote($v, '/');
$patterns[] = '/ <((?i:' . implode('|', $pair_tags) . '))' . $re_attrs_fast_safe . '(?<!\/)>
.*?
<\/(?i:\\1)' . $re_attrs_fast_safe . '>
/sxSX';
}
#d($patterns);
$i = 0; #защита от зацикливания
$max = 99;
while ($i < $max)
{
$s2 = preg_replace($patterns, '', $s);
if (preg_last_error() !== PREG_NO_ERROR)
{
$i = 999;
break;
}
if ($i == 0)
{
$is_html = ($s2 != $s || preg_match($re_tags, $s2));
if (preg_last_error() !== PREG_NO_ERROR)
{
$i = 999;
break;
}
if ($is_html)
{
if ($is_format_spaces)
{
/*
В библиотеке PCRE для PHP \s - это любой пробельный символ, а именно класс символов [\x09\x0a\x0c\x0d\x20\xa0] или, по другому, [\t\n\f\r \xa0]
Если \s используется с модификатором /u, то \s трактуется как [\x09\x0a\x0c\x0d\x20]
Браузер не делает различия между пробельными символами, друг за другом подряд идущие символы воспринимаются как один
*/
#$s2 = str_replace(array("\r", "\n", "\t"), ' ', $s2);
#$s2 = strtr($s2, "\x09\x0a\x0c\x0d", ' ');
$s2 = preg_replace('/ [\x09\x0a\x0c\x0d]++
| <((?i:pre|textarea))' . $re_attrs_fast_safe . '(?<!\/)>
.+?
<\/(?i:\\1)' . $re_attrs_fast_safe . '>
\K
/sxSX', ' ', $s2);
if (preg_last_error() !== PREG_NO_ERROR)
{
$i = 999;
break;
}
}
#массив тагов, которые не будут вырезаны
if ($allowable_tags) $_allowable_tags = array_flip($allowable_tags);
#парные таги, которые будут восприниматься как параграфы
if ($para_tags) $_para_tags = array_flip($para_tags);
}
}#if
#tags processing
if ($is_html)
{
$_callback_type = 'strip_tags';
$s2 = preg_replace_callback($re_tags, __FUNCTION__, $s2);
$_callback_type = false;
if (preg_last_error() !== PREG_NO_ERROR)
{
$i = 999;
break;
}
}
if ($s === $s2) break;
$s = $s2; $i++;
}#while
if ($i >= $max) $s = strip_tags($s); #too many cycles for replace...
if ($is_format_spaces && strlen($s) !== $length)
{
#remove a duplicate spaces
$s = preg_replace('/\x20\x20++/sSX', ' ', trim($s));
#remove a spaces before and after new lines
$s = str_replace(array("\r\n\x20", "\x20\r\n"), "\r\n", $s);
#replace 3 and more new lines to 2 new lines
$s = preg_replace('/[\r\n]{3,}+/sSX', "\r\n\r\n", $s);
}
function removeEvilAttributes($tagSource)
{
$stripAttrib='javascript:|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup';
return stripslashes(preg_replace("/$stripAttrib/i",'forbidden',$tagSource));
}
return preg_replace('/<(.*?)>/ie',"'<'.removeEvilAttributes('\\1').'>'",$s);
}
Ну и кучка других полезных функций для работы с текстом
Спустя 59 минут, 48 секунд (21.03.2010 - 13:54) glock18 написал(а):
Nikitian
функция неплохая, но не дает гарантии вовсе. как я уже говорил, ie полон багов. вот один из них:
насколько я помню, такое прекрасно отработает в ie6.
еще например, текст можно передавать в виде кодов символов. на сервере это будет просто набор % и чисел, а после попадания на страницу он будет интерпретирован.
еще что не покрыто функцией, насколько я смог заметить (поправь если не прав) - ie css expression'ы.
реализаций этого я уже видел немало. однако, после изучения вопроса понял, что сделать все на 100% не так просто.
мысли у самого были как это все учесть, но пока потребности как таковой не возникало.
функция неплохая, но не дает гарантии вовсе. как я уже говорил, ie полон багов. вот один из них:
<scr
ipt>alert('123');</scr ipt>
насколько я помню, такое прекрасно отработает в ie6.
еще например, текст можно передавать в виде кодов символов. на сервере это будет просто набор % и чисел, а после попадания на страницу он будет интерпретирован.
еще что не покрыто функцией, насколько я смог заметить (поправь если не прав) - ie css expression'ы.
реализаций этого я уже видел немало. однако, после изучения вопроса понял, что сделать все на 100% не так просто.
мысли у самого были как это все учесть, но пока потребности как таковой не возникало.
Спустя 1 час, 34 минуты, 55 секунд (21.03.2010 - 15:29) Nikitian написал(а):
Цитата (glock18 @ 21.03.2010 - 10:54) |
Nikitian функция неплохая, но не дает гарантии вовсе. как я уже говорил, ie полон багов. вот один из них: <scr насколько я помню, такое прекрасно отработает в ie6. |
Неправильно помните, не работает оно в IE6
Цитата (glock18 @ 21.03.2010 - 10:54) |
еще например, текст можно передавать в виде кодов символов. на сервере это будет просто набор % и чисел, а после попадания на страницу он будет интерпретирован. |
И к чему это здесь? Таким образом нельзя писать теги, только контент.
Цитата (glock18 @ 21.03.2010 - 10:54) |
еще что не покрыто функцией, насколько я смог заметить (поправь если не прав) - ie css expression'ы. |
Запрет на тег style вполне логичен, а в атрибуте style врдое как нельзя экспрешны использовать.
Цитата (glock18 @ 21.03.2010 - 10:54) |
реализаций этого я уже видел немало. однако, после изучения вопроса понял, что сделать все на 100% не так просто. мысли у самого были как это все учесть, но пока потребности как таковой не возникало. |
Всё лучше, чем вообще не фильтровать, а ведь задача-то часто встречается.
Спустя 55 минут, 11 секунд (21.03.2010 - 16:24) glock18 написал(а):
Цитата |
Всё лучше, чем вообще не фильтровать |
что правда, то правда, не спорю.
Цитата |
Неправильно помните, не работает оно в IE6 |
видимо ошибся в каких-то знаках. или месте, куда их поставить. сам когда-то проверял такую запись - было действительно удивлением, но запись в духе этой пройдет в ie. сейчас, увы, не смог найти подтверждения.
Цитата |
И к чему это здесь? Таким образом нельзя писать теги, только контент. |
хм, да ошибся здесь.
Цитата |
а в атрибуте style врдое как нельзя экспрешны использовать. |
можно
Спустя 1 час, 42 минуты, 26 секунд (21.03.2010 - 18:06) Romms написал(а):
Надо будет поискать... Наверное создатели tinyMCE уже предложили какой-то способ защиты...
Наверное это основная причина пользоваться BB кодами
Наверное это основная причина пользоваться BB кодами
Спустя 46 минут, 57 секунд (21.03.2010 - 18:53) phz написал(а):
Чуть не в тему... Вот редактор http://www.openwebware.com сам уже заменяет на спец. сиволы.
Спустя 4 минуты, 40 секунд (21.03.2010 - 18:58) Nikitian написал(а):
Цитата (phz @ 21.03.2010 - 15:53) |
Чуть не в тему... Вот редактор http://www.openwebware.com сам уже заменяет на спец. сиволы. |
Дело не в том, кто и что заменяет, а в том, как обезопасить получаемые данные. Напомню, отправить данные можно вообще в обход редактора.