Я обнаружил, что добавляю их ВЕЗДЕ в свое приложение.
В самом деле? Необычно иметь много пользовательских входов, которые принимают HTML. Большинство входных данных должны быть простым текстом, чтобы при вводе пользователем <
они буквально получали знак «меньше», а не тег (потенциально очищенный / отфильтрованный). Это требует HTML-кодирования на этапе вывода. Обычно вы получаете это из тега <c:out>
.
(Старая школа JSP до JSTL, к сожалению, не предоставляла HTML-кодировщик, поэтому, если по какой-то причине именно с этим вы работаете, вам придется предоставить собственный метод кодирования HTML, построенный из строковых замен, или использовать один из множества сторонних инструментов, которые его содержат.)
Для полей «расширенный текст», которые обычно «мало, если вообще-то есть», которые специально предназначены для преднамеренного приема пользовательских HTML, вам следует тщательно их фильтровать, чтобы предотвратить внедрение JavaScript из разметки. Это сложная работа! «Пара простых утилитарных методов, которые удаляют HTML», вряд ли будут делать это правильно и безопасно.
Правильный способ сделать это - проанализировать входной HTML в DOM; пройдитесь по нему, проверяя, что используются только известные безопасные имена элементов и атрибутов; затем сериализовать его обратно в правильно сформированный [X] HTML. Есть ряд инструментов, которые могут сделать это, и да, jTidy один. Вы должны использовать метод Tidy.parseDOM
для значения поля ввода, удалить ненужные элементы из полученного DOM с помощью removeChild
и removeAttribute
, а затем выполнить повторную сериализацию с помощью pprint
.
Хорошей альтернативой форматированному тексту на основе HTML является предоставление пользователю более простой формы текстовой разметки, которую можно затем преобразовать в известные безопасные теги HTML. Как и это текстовое поле, в которое я сейчас набираю.