Эта тема на forum.dklab.ru


Maus:
Rin
<!-- -->
<table summary="A > B or not?">
Rin:
Для html комментариев правки сделал,
во втором случае все-таки нехорошо использовать знаки < > внутри кавычек.
Нужно использовать соответствующие сущности &lt; и &gt;.
Хотя можно попытаться написать более изощренное регулярное выражение для этого случая, но работать будет медленнее.

Rin
<!-- -->
<table summary="A > B or not?">
Maus:
Нужно использовать соответствующие сущности &lt; и &gt;
Нужно. Но Вы сами привели пример, где это нарушается.
можно попытаться написать более изощренное регулярное выражение
вложенность считать придется.
Rin:
Готово!
Я протестировал, все работает корректно.
Maus:
Rin
$s = <<<TST
<INPUT name="fred" value="stone" disabled>описание инпута
вззык<br />кабщщь
TST;
echo strip_tags_smart($s, true);

с точки зрения "борца со злостными юзерами", это может быть и хорошо: раз [злостный юзер] написал кривой HTML - сам виноват в том, что лишнее обрезалось.
Согласны или попробуете доработать?
(имхо, написать абсолютно правильный вариант нереально: даже Tidy, наткнувшись на особо злую багу, может после неё выдавать несуществующие ошибки)
Rin:
Код подправлен, так же вырезается <!DOCTYPE...> и PHP/Perl/ASP код.
Есть возможность заменить <br /> на "\r\n".
Maus:
Rin
дополните, пожалуйста, еще примерами - что на входе и что на выходе
Maus:
Выделено из темы «strip_tags_smart: корректный аналог strip_tags()»,
расположенной в форуме Склад готовых решений :: PHP (27 Февраля 2006, 14:23).
Maus:
Перенесено из форума: Склад готовых решений :: PHP.
Перенесено в форум: Разное :: PHP.
Rin:
Дополнил.
Еще добавил возможность вырезания парных тагов вместе с содержимым.
Например: <script>alert(1)</script>
Maus:

Еще добавил возможность вырезания парных тагов вместе с содержимым.
Например: <script>alert(1)</script>

а это не чересчур?
<strong>очень нужный текст, только выделенный</strong>
Rin:
Вырезаются только заданные таги, не все. :)
Rin:
v3.0.0
Добавлена опция для грамотного преобразования text/html в text/plain

v2.0.5
Добавлена обработка блоков CDATA
Исправлена ошибка для вырезания непарных тагов типа <tagname/>
Rin:
Всем, кто использует эту функцию, рекомендуется обновиться.
Добавлена защита от подделок типа: "<<fake>script>alert('hi')</</fake>script>"
Andrej:
Здравствуйте!
имеется несколько новостных сайтов. В большинстве случаев они берут информацию из RSS каналов.

Сейчас пытаюсь добавить strip_tags_smart для обработки входящих RSS лент, поскольку там иной раз попадается что угодно. Вроде бы солидный сайт, смотришь, или его хакнули или еще что то, но в RSS ленте какая нить бяка да сидит... поэтому хотелось бы обезопасить свои сайты...

В общем, в $allowable_tags добавил следующий код:

$allowable_tags = array('a','p','br','center','strong','em','pre','code','b','i','u','ol','ul','li','pre','hr','blockquote','img','table','td','tr','th', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div'),

Вроде бы кроме 'a' и 'img' остальное опасности не представляет, или я не прав? Если ошибаюсь, подскажите.

С тегом 'img' чуствую что подвох может быть, но с какой стороны не пойму, был бы благодарен за подсказку.

А вот с тегом 'a' подвох может быть таким, <a href="javascript:alert(1);" target="_blank" onMouseOver = "alert(1)">test onMouseOver</a>
и strip_tags_smart это игнорирует!!!

Обширную дискуссию обноружил здесь http://www.omsk777.ru/all.php?act=funct&argument=strip-tags
Здесь же обнаружил решение проблемы, осталось только скрестить strip_tags_smart с вырезанием опасного кода из нужных тегов


tREXX [www.trexx.ch]
15-Oct-2003 05:15

Here's a quite fast solution to remove unwanted tags AND also unwanted attributes within the allowed tags:

<?php
/**
* Allow these tags
*/
$allowedTags = '<h1><b><i><a><ul><li><pre><hr><blockquote><img>' ;

/**
* Disallow these attributes/prefix within a tag
*/
$stripAttrib = 'javascript:|onclick|ondblclick|onmousedown|onmouseup|onmouseover|' .
'onmousemove|onmouseout|onkeypress|onkeydown|onkeyup' ;

/**
* return string
* @param string
* @desc Strip forbidden tags and delegate tag-source check to removeEvilAttributes()
*/
function removeEvilTags ( $source )
{
global $allowedTags ;
$source = strip_tags ( $source , $allowedTags );
return preg_replace ( '/<(.*?)>/ie' , "'<'.removeEvilAttributes('\\1').'>'" , $source );
}

/**
* return string
* @param string
* @desc Strip forbidden attributes from a tag
*/
function removeEvilAttributes ( $tagSource )
{
global $stripAttrib ;
return stripslashes ( preg_replace ( "/$stripAttrib/i" , 'forbidden' , $tagSource ));
}

// Will output: <a href="forbiddenalert(1);" target="_blank" forbidden =" alert(1)">test</a>
echo removeEvilTags ( '<a href="javascript:alert(1);" target="_blank" onMouseOver = "alert(1)">test</a>' );
?>


Да, теги 'a' и 'img' нужны однозначно, предлагать их вырезать не нужно :) RSS канал не должен менять содержание.
Rin:
Вырезать потенциально опасный код -- не задача strip_tags_smart().
Для этого существуют другие функции.
Andrej:
Еще один ньюанс, ломается содержимое <PRE> </PRE>

нужно или коментировать $s2 = strtr($s2, "\r\n\t", " "); или не обрабатывать содержимое в PRE
Rin:
Fixed in 4.0.5
Mooshilda: strip_tags_smart (обсуждение)
Спасибо большое за функцию и энтузиазм. Вы мне очень помогли.
Использовал для исправления поиска на "механоид ру"
Mooshilda: strip_tags_smart (обсуждение)
Если хотите, то я могу разместить Ваш копирайт на сайте "механоид ру", где успешно трудится Ваша функция.:-)
Rin:
Не нужно, спасибо. :)

Эта тема на forum.dklab.ru