Выходной текст JSF со стилем html
Мне нужен выходной текст, который работает как h:outputText с атрибутом escape="false", но не запускает сценарии. После небольшого поиска я обнаружил, что tr:outputFormatted делает это, но в нашем проекте мы не используем тринидад. Есть ли что-то вроде outputFormatted в томагавке или в другом taglib?
например,
<h:outputText id="id" value="<b>test text</b><script type="text/javascipt">alert('I dont want these alert to show');</script>" escape="false"/>
это показывает 'тестовый текст' жирным шрифтом, но это также вызывает диалоговое окно с предупреждением, я не хочу, чтобы скрипт запускался. он может написать код сценария или удалить его, но не должен запускаться.
1 ответ
Используйте анализатор HTML, чтобы избавиться от этих вредоносных вещей.
Среди прочего, Jsoup способен на это. Вот выдержка из его сайта.
Очистить ненадежный HTML
проблема
Вы хотите разрешить ненадежным пользователям предоставлять HTML для вывода на ваш сайт (например, в виде комментариев). Вы должны очистить этот HTML-код, чтобы избежать атак межсайтового скриптинга (XSS).
Решение
Используйте jsoup HTML
Cleaner
с конфигурацией, указаннойWhitelist
,String unsafe = "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>"; String safe = Jsoup.clean(unsafe, Whitelist.basic()); // now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>
Итак, все, что вам в основном нужно сделать, это следующее при подготовке текста:
String sanitizedText = Jsoup.clean(rawText, Whitelist.basic());
(вы можете сделать это до или после сохранения текста в БД, но имейте в виду, что, делая это раньше, не сохраняя оригинальный текст, вы больше не сможете обнаружить злоумышленников и больше выполнять социальные действия)
и затем отобразите это следующим образом:
<h:outputText value="#{bean.sanitizedText}" escape="false" />