Htmlspecialchars мешает стандартному отображению тегов

Статус
Закрыто для дальнейших ответов.

Frants

New Member
Регистрация
11.01.2012
Сообщения
7
Для защиты от межсайтового скриптинга использую функцию htmlspecialchars:

Код:
<?php echo htmlspecialchars($myrow['text']); ?>
Но она превращает все теги, хранимые вместе с текстом в базе данных в HTML-сущности, т.е. '<' преобразуется в '&lt;' и т.д. В итоге на экране текст появляется вместе с тегами:
Код:
<p><strong>Галактика</strong> - это ... </p>
Ну и, как вы уже догадались, вопрос: как избежать появления тегов на экране в выводимом тексте?

Пока придумал только такой способ: в БД вместо, например, вместо тега '<p>' использую '&lt;p&gt;', а вместо функции htmlspecialchars использую ее обратный вид: htmlspecialchars_decode. Так работает, но защищает ли это от межсайтового скриптинга?
 

minority

generator randomly php
Регистрация
02.05.2010
Сообщения
443
Использовать BB тэги, если это админку то ненужно экранировать.
 

антиКИЛЛЕР

Well-Known Member
Регистрация
28.07.2011
Сообщения
92
Или можно составить массив регулярных выражений для всего неправильного или правильного (в зависимости от того сколько возможностей пользователем хотите предоставить и насколько критична всё же атака) и парсить входящий текст регулярками.
Я так в своё время вырезал все плохие теги типа скриптов, фреймов, объектов а так же все нехорошие атрибуты начинающиеся на on.

Вот собтственно оно:
Код:
function del_bad_tegs($str)
{
$bad_tags=array
(
  '@(<\s*(NO){0,1}SCRIPT[^>]*?>[^<]*?<\s*/\s*(NO){0,1}SCRIPT\s*>|<\s*(NO){0,1}SCRIPT[^>]*>)@simx',
  '@(<\s*FRAME[^>]*?>[^<]*?<\s*/\s*FRAME\s*>|<\s*FRAME[^>]*>)@simx',
  '@(<\s*NOFRAMES[^>]*?>[^<]*?<\s*/\s*NOFRAMES\s*>|<\s*NOFRAMES[^>]*>)@simx',
  '@(<\s*IFRAME[^>]*?>[^<]*?<\s*/\s*IFRAME\s*>|<\s*IFRAME[^>]*>)@simx',
  '@(<\s*FRAMESET[^>]*?>[^<]*?<\s*/\s*FRAMESET\s*>|<\s*FRAMESET[^>]*>)@simx',
  '@(<\s*MARQUEE[^>]*?>[^<]*?<\s*/\s*MARQUEE\s*>|<\s*MARQUEE[^>]*>)@simx',
  '@(<\s*APPLET[^>]*?>[^<]*?<\s*/\s*APPLET\s*>|<\s*APPLET[^>]*>)@simx',
  '@(<\s*FORM[^>]*?>[^<]*?<\s*/\s*FORM\s*>|<\s*FORM[^>]*>)@simx',
  '@(<\s*INPUT[^>]*?>[^<]*?<\s*/\s*INPUT\s*>|<\s*INPUT[^>]*>)@simx',
  '@(<\s*BUTTON[^>]*?>[^<]*?<\s*/\s*BUTTON\s*>|<\s*BUTTON[^>]*>)@simx',
  '@(<\s*HEAD[^>]*?>[^<]*?<\s*/\s*HEAD\s*>|<\s*HEAD[^>]*>)@simx',
  '@(<\s*HTML[^>]*?>[^<]*?<\s*/\s*HTML\s*>|<\s*HTML[^>]*>)@simx',
  '@(<\s*BODY[^>]*?>[^<]*?<\s*/\s*BODY\s*>|<\s*BODY[^>]*>)@simx',
  '@(<\s*(NO){0,1}EMBED[^>]*?>[^<]*?<\s*/\s*(NO){0,1}EMBED\s*>|<\s*(NO){0,1}EMBED[^>]*>)@simx',
  '@(<\s*LINK[^>]*?>[^<]*?<\s*/\s*LINK\s*>|<\s*LINK[^>]*>)@simx',
  '@(<\s*OBJECT[^>]*?>[^<]*?<\s*/\s*OBJECT\s*>|<\s*OBJECT[^>]*>)@simx',
  '@(<\s*TEXTAREA[^>]*?>[^<]*?<\s*/\s*TEXTAREA\s*>|<\s*TEXTAREA[^>]*>)@simx',
  '@<\w+?[^\>]*?on\w+?=[^\>]*?\>[^\<]*?</\w+?>@simx',//Этот и след удаляют теги с атрибутом on (onload,onchange и подобные)
  '@<\w+?[^\>]*?on\w+?=[^\>]*?\>@simx',
);
$str=preg_replace($bad_tags, '!ЗАПРЕЩЁННЫЙ ТЭГ!', $str);
return $str;
}
Только учтите, это нужно дорабатывать - писать это давно, тогда вроде работало, но всё же некоторые моменты не учтены, например вставка скрипта в атрибут href у ссылок, да и не говоря о том чтобы учитывать html5. Да и мало ли ещё на какие ухищрения хватит воображения.
От целенаправленной атаки человеком не помощет, а если атакует школо-ло, или автоматический скрипт то данные скорее всего отфильтруются.
 
Статус
Закрыто для дальнейших ответов.
Верх Низ