Нет смысла проверять пользовательский ввод в HTML-контенте. Вы можете просто экранировать HTML при повторном отображении этого пользовательского ввода на веб-странице. Поскольку вы упомянули, что вы используете Java на стороне сервера и, следовательно, вы, скорее всего, используете JSP в качестве технологии просмотра, полезно знать, что вы можете использовать JSTL <c:out>
тег и fn:escapeXml()
функция для выхода из HTML перед печатью для вывода.
например. при повторном отображении контролируемого пользователем ввода:
<c:out value="${somebean.sometext}" />
или при повторном отображении пользовательского параметра запроса:
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
Таким образом, например, <script>alert('xss')</script>
будет выводиться в вывод HTML как <script>alert('xss')</script>
и, таким образом, будет отображаться в HTML буквально как конечный пользователь, введенный сам по себе.
Если вы действительно настаиваете на подтверждении этого, вы можете в конечном итоге получить для этого HTML-парсер, например Jsoup .
String text = request.getParameter("text");
if (!text.equals(Jsoup.parse(text).text())) {
// There was HTML in the text.
}
Обновление в соответствии с комментариями, которые вы на самом деле хотите очистить для ввода по белому списку HTML, чтобы удалить потенциальные вредоносные теги. Вы можете сделать это и с Jsoup, см. Также эту страницу .
String sanitized = Jsoup.clean(text, Whitelist.basic());
Допустимые элементы Whitelist#basic()
указаны в документации API .