Очистить пользовательский ввод от нежелательного HTML в веб-приложении Spring - PullRequest
1 голос
/ 04 августа 2010

Мне нужно привести в порядок пользовательский ввод в веб-приложении, чтобы удалить определенные HTML-теги и кодировать

Я сделал несколько простых утилитарных методов, которые удаляют HTML, но я обнаружил, что добавляю их ВЕЗДЕ в свое приложение.

Есть ли более разумный способ привести пользователя в порядок? Например. в процессе привязки или как фильтр как-то?

Я видел JTidy, который может выступать в качестве фильтра сервлетов, но я не уверен, что это то, чего я хочу, потому что мне нужно очищать ввод данных пользователем, а не вывод моих JSP.

С домашней страницы JTidy:

Может использоваться как инструмент для очистки искаженного и неисправного HTML-кода, сгенерированного вашим динамическим веб-приложением.

Он может проверять HTML без изменения вывода и генерировать предупреждения для каждой страницы, чтобы вы могли определить JSP или сервлет, которые необходимо исправить.

Это может сэкономить вам часы времени. Чем больше HTML вы пишете в JSP или Servlets, тем больше времени вы сэкономите. Не тратьте время на поиск проблем вручную, выясняя, почему ваш HTML-код не отображается так, как должен.

В дополнение к проверке JTidy вы можете отправлять динамически сгенерированные страницы в онлайновые средства проверки HTML, например, Службу проверки разметки W3C, Инструмент доступности WAVE или Средство проверки HTML WDG, даже если вы находитесь за межсетевым экраном.

Ответы [ 2 ]

1 голос
/ 04 августа 2010

Я обнаружил, что добавляю их ВЕЗДЕ в свое приложение.

В самом деле? Необычно иметь много пользовательских входов, которые принимают HTML. Большинство входных данных должны быть простым текстом, чтобы при вводе пользователем < они буквально получали знак «меньше», а не тег (потенциально очищенный / отфильтрованный). Это требует HTML-кодирования на этапе вывода. Обычно вы получаете это из тега <c:out>.

(Старая школа JSP до JSTL, к сожалению, не предоставляла HTML-кодировщик, поэтому, если по какой-то причине именно с этим вы работаете, вам придется предоставить собственный метод кодирования HTML, построенный из строковых замен, или использовать один из множества сторонних инструментов, которые его содержат.)

Для полей «расширенный текст», которые обычно «мало, если вообще-то есть», которые специально предназначены для преднамеренного приема пользовательских HTML, вам следует тщательно их фильтровать, чтобы предотвратить внедрение JavaScript из разметки. Это сложная работа! «Пара простых утилитарных методов, которые удаляют HTML», вряд ли будут делать это правильно и безопасно.

Правильный способ сделать это - проанализировать входной HTML в DOM; пройдитесь по нему, проверяя, что используются только известные безопасные имена элементов и атрибутов; затем сериализовать его обратно в правильно сформированный [X] HTML. Есть ряд инструментов, которые могут сделать это, и да, jTidy один. Вы должны использовать метод Tidy.parseDOM для значения поля ввода, удалить ненужные элементы из полученного DOM с помощью removeChild и removeAttribute, а затем выполнить повторную сериализацию с помощью pprint.

Хорошей альтернативой форматированному тексту на основе HTML является предоставление пользователю более простой формы текстовой разметки, которую можно затем преобразовать в известные безопасные теги HTML. Как и это текстовое поле, в которое я сейчас набираю.

0 голосов
/ 04 августа 2010

В Spring MVC есть интерфейс Interceptor, который можно использовать для выполнения некоторых общих задач при каждом запросе. Независимо от того, какой инструмент вы используете для уборки, вы можете использовать его для получения того, что вам нужно в какой-то момент. См. это руководство , чтобы управлять с помощью ut. Просто поместите процедуру очистки в метод preHandle и просмотрите данные в HttpServletRequest, чтобы обновить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...