Я разрешу пользователям отправлять HTML файлы, стирать теги сценария и стиля (ofc), но некоторые элементы, такие как Bold и Italic, выходят из DIVision, где входит пользовательский контент. Если они забудут закрыть их, я имею в виду.
Пример:
Пользователь отправляет:
I'm entering a <b>tunne----------------
Страница заканчивается следующим образом:
<div>
I'm entering a <b>tunne----------------
</b><div><b> **rest of the page**
И таким образом вся остальная часть страницы становится жирной. Меня смущает поведение (почему эти вещи не остаются в их клетках?). И мне нужно аккуратное решение. Я бы хотел, чтобы там была клетка, но нет. Использование iframe для этого крайне неуместно.
Есть идеи? Я бы предпочел решить это, не написав парсер, чтобы найти закрытые теги.
К сожалению, нет способа заставить браузер интерпретировать несбалансированные теги для вас. Возьмите этот сценарий:
<b>foo <i>bar</b> baz</i>
Если он оставит теги на месте и отобразит их как
foo bar baz
или должен ли браузер предположить, что <i>
является дочерним и перемещает его закрывающий тег? Или, может быть, пользователь имел в виду, что <b>
является дочерним и перемещает свой закрывающий тег?
Если вы хотите разрешить разметку пользователя и хотите избежать проблем с рендерингом, вы можете либо подсчитать общее количество открывающих/закрывающих тегов, чтобы убедиться, что они балансируют (и вычеркивают все теги, если они этого не делают), или используют более пуленепробиваемый сервис, такой как Хорен, выше.
Кроме того, это, вероятно, очень неразумно, чтобы пользователи могли отправлять HTML. Даже если вы заносили в черный список определенные теги, вероятно, осталась целая куча других эксплойтов. Гораздо лучше разрешить пользователям вводить ограничения Markdown или BBcode, а затем конвертировать символы, которые вы разрешаете в HTML.
Вы можете использовать html sanitizer, как php tidy, который очистит и исправит ваш исходный код.
Еще одним вариантом AFAIK был бы HTML-очиститель