Замена htmlspecialchars...

ccop

Новичок
Замена htmlspecialchars...

Админка, форма с textarea элементом, содержимое которой выводится на внешнем сайте.
В форму можно вставлять html-тэги, т.е. использовать htmlspecialchars нет никакого смысла.
Проблема: когда вводится, к примеру, cout<<""; '<<' воспринимаются на сайте "как html-тэги", что влечет за собой глюки с дизайном, ну эт понятно.
Задача: надо как-то "научиться" разлечать html это тэг или нет.
Мое решение: база всех возможных html-тэгов (или хотя бы "популярных"), при добавлении формы в БД, делать проверку, если '<' символ нашелся и дальше не идет какой-то из пересчитанных тэгов, преобразовывать символ в хтмл-эквивалент. Вариант, в прицнипе, просто, но есть два минуса... первый - надо просчитать все тэги, второй - возможные тормоза при добавлении, эт пока перебор сделаешь... В случаи с '>' символом вести счетчик.

И так... буду рад за любые советы, может есть какое-то просто решение и я не в том направлении думаю, или может у кого-то уже есть подобные функции.

Зарание спасибо!
 

T. Anre

Новичок
Re: Замена htmlspecialchars...

Автор оригинала: ccop
Админка, форма с textarea элементом, содержимое которой выводится на внешнем сайте.
В форму можно вставлять html-тэги, т.е. использовать htmlspecialchars нет никакого смысла.
Проблема: когда вводится, к примеру, cout<<""; '<<' воспринимаются на сайте "как html-тэги", что влечет за собой глюки с дизайном, ну эт понятно.
Задача: надо как-то "научиться" разлечать html это тэг или нет.
Мое решение: база всех возможных html-тэгов (или хотя бы "популярных"), при добавлении формы в БД, делать проверку, если '<' символ нашелся и дальше не идет какой-то из пересчитанных тэгов, преобразовывать символ в хтмл-эквивалент. Вариант, в прицнипе, просто, но есть два минуса... первый - надо просчитать все тэги, второй - возможные тормоза при добавлении, эт пока перебор сделаешь... В случаи с '>' символом вести счетчик.

И так... буду рад за любые советы, может есть какое-то просто решение и я не в том направлении думаю, или может у кого-то уже есть подобные функции.

Зарание спасибо!
PHP Input Filter
 

ustas

Элекомист №1
SimpleXML - работает быстро, можно перебрать все теги, лишние убрать легко. элегантное решение получается.
правда соблюдать стандарт нужно, скобки закрывающие, и т.п.
 

jonjonson

Охренеть
Ещё ссылка http://pixel-apes.com/safehtml/?page=safehtml
Возможно поможет чем...
 

ccop

Новичок
jonjonson
спасибо

Тут начал разбираться с PHP Input Filter, сделал такой примерчик:
PHP:
<?
	require_once("class.inputfilter_clean.php");

	$tags = explode(',', "");
	for ($i = 0; $i < count($tags); $i++) $tags[$i] = trim($tags[$i]);

	$attr = explode(',', "");
	for ($i = 0; $i < count($attr); $i++) $attr[$i] = trim($attr[$i]);

	$tag_method = 1;//0-Remove all tags but specified, 1-Remove only specified tags
	$attr_method = 1;//0-Remove all attibutes but specified, 1-Remove only specified attibutes
	$xss_auto = 1;

	// more info on parameters in documentation.
	$myFilter = new InputFilter($tags, $attr, $tag_method, $attr_method, $xss_auto);
	$result = $myFilter->process("dda<<sd<br><br/><br /><div>sdsd</div>");
	
	echo $result;
?>
На выходе получаю: dda<<sd<br /><br /><div>sdsd</div>
1. Куда-то пропало первое "<br>"
2. Не закодировались символы << в хтмл-эквивалент.

Как быть?

Потестировал http://pixel-apes.com/safehtml/example/safehtml.php, почти то, что мне нужно, вывело:
dda&lt;<br /><br /><div>sdsd</div>
1. Пропал второй символ <
2. Пропал первый <br>

Может я что-то не так делаю, или эти скрипты не рашают мою роблему?

ustas, на счет SimpleXML, можешь навести пример? К сожалению с SimpleXML не работал раньше и пока ничего не придумал.

Всем спасибо!

-~{}~ 04.06.07 14:29:

Wicked, не увидел твое сообщение. ББкоды использовать нельзя, так как по сути у меня может быть любой хтмл-тэг. Да и неудобно это... А вот с той темы ссылочку http://dmitry.eu/files/php/class.xhtmlscrubber.phps проверю... спасибо!

-~{}~ 04.06.07 14:35:

Протестировал http://dmitry.eu/files/php/class.xhtmlscrubber.phps, работает, кажеться без глюков, только такой нюанс: нужно делать разрешения на все тэги, но это еще пол-беды, к каждому тэгу надо разрешать свои аттрибуты... :(
 

Wicked

Новичок
ccop
это вывод из предназначения это тулзы - обезопасить потенциально опасный код. Если у тебя админ - паинька, то это лишнее, да.
 

С.

Продвинутый новичок
Произвольное использование знаков "больше", "меньше" в тексте (вне тегов) никакие верстки ни в каком браузере еще не портили.
 

ccop

Новичок
С., ))) я говорю то, что вижу... если такая проблема существует, ее надо устранить...
 

С.

Продвинутый новичок
Я то думал у тебя таблицы поползли, логотипы на задницу натянулись...

Дурью маешься. Проблемы не существует, нечего устранять.

Если там поставить вполне легальный <td>, у тебя гораздо больше глюков на странице будет.
 

ccop

Новичок
С.
блин, это я привел пример, есть примеры когда таблицы ползут, логоты и так далее. Ведь после "открытого", якобы, тэга, другие тэги не воспринимаются.

Мне не надо прощитывать легально стоит там <td> или нет, читай начало, там описано мою проблему.
 

totamon

Новичок
перечитал первый пост... ламерский вопрос возник:)
а зачем вводить cout<<""; ? а в ХТМЛ страничку вы как бы такой вставили?
 

ccop

Новичок
totamon
Блин, да вопрос не ламерский, ну зачем зря засорять тему...
В админке есть редактор, через который можно сгенерировать страницу, он работает отлично, но не всегда этим редактором пользуются и, как результат, возникла такая проблема. Это не я придумал, это, как говориться, реальный жизненный факт.
Неужели сложно что-то толковое посоветовать и ответить на пару конкретных вопросов.

Протестировал http://dmitry.eu/files/php/class.xhtmlscrubber.phps, работает, кажеться без глюков, только такой нюанс: нужно делать разрешения на все тэги, но это еще пол-беды, к каждому тэгу надо разрешать свои аттрибуты...
Как мне разрешить все (что значит любые) аттрибуты для всех тэгов?
 

С.

Продвинутый новичок
ccop, такие вещи правятся тем же местом, которым искривлялись -- руками. У тебя ведь этих "поползших" таблиц полторы штуки, не правда ли?
 

ccop

Новичок
С.
если не можешь отвечать на мои вопросы, пожалуйста, не отвечай и не пиши в этой теме, не забирай не свое, не мое время. Причем здесь мои таблицы?
 

С.

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