swanrnd
@swanrnd
Издатель HTML5 игр

Как отфильтровать HTML от XSS и прочей фигни?

У меня есть wiziwig-редактор, который генерирует код HTML, пример:
<p class="line" id="line-1"><span style="color: rgb(230, 0, 0);"><span style="background-color: rgb(255, 153, 0);">affasf</span></span><span style="background-color: rgb(255, 255, 255);"><span style="color: rgb(230, 0, 0);"><span style="background-color: rgb(255, 153, 0);">dadssadasda</span></span></span></p><p class="line" id="line-35">эллэл</p><p class="line" id="line-43">шхохохх</p><p class="line" id="line-56"><span style="color: rgb(230, 0, 0);"><span style="background-color: rgb(255, 153, 0);"><b>dddddad</b></span></span></p>


Он отправляется через Ajax и возвращается через Ajax при выводе.

Что я собираюсь делать:
1) заменяю < и > на [ и ]
2) удаляю кавычки из тегов
3) заменяю &,",' на их html представление
В этом виде я храню в БД
При выводе на клиент:
заменяю разрешенные теги:[b] -> <b>и прочее

Но возникла такая проблема: А что если кто-то не закроет тег, допустим [b], тогда весь низ будет жирным.

Есть ли способы решить проблему без подсчета открытых и закрытых тегов?
Может, лучше воткнуть все в Iframe? То с какими параметрами?
Есть ли другие варианты работы с HTML текстом?
  • Вопрос задан
  • 2734 просмотра
Решения вопроса 1
Akdmeh
@Akdmeh
PHP, Yii2, Music
Во-первых, существует такое решение, как HTMLPurifier, который удаляет все неразрешенные теги.
Во-вторых, простая автозамена не поможет, желательно использовать регулярки, при которых если тег непарный, он не будет парситься.
Во-третьих, существуют редакторы, которые генерируют BB-разметку. Мне очень нравится WysiBB благодаря небольшому весу, большим возможностям расширения и минималистичный дизайн.
Если вас заинтересует данный редактор - смогу скинуть набор правил для автозамены.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
Запомните раз и навсегда - HTML фильтруется один раз, перед выводом в браузер.
Если используете PHP - есть замечательная функция htmlspecialchars. Для других языков существуют похожие решения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы