Как реализовать возможность для пользователя безопасно публиковать некоторые данные в формате html? - PullRequest
6 голосов
/ 05 августа 2010

У меня есть textarea, и я хочу поддерживать простейшее форматирование для публикуемых данных (по крайней мере, пробелы и разрывы строк).

Как мне этого добиться? Если я не буду избегать ответа и сохраню некоторые html-теги, тогда это будет серьезной дырой в безопасности. Но я не вижу другого решения, которое позволило бы форматировать текст в браузере.

Итак, я, вероятно, должен фильтровать ввод пользователя. Но как я могу это сделать? Есть ли готовые к использованию решения? Я использую JSF, так есть ли какой-нибудь умный компонент, который фильтрует все, кроме HTML-тегов?

Ответы [ 2 ]

8 голосов
/ 05 августа 2010

Используйте анализатор HTML, который поддерживает фильтрацию 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>

А затем, чтобы отобразить ее с сохранением пробелов, примените CSS white-space: pre-wrap; к элементу HTML, в котором вы отображаетеit.

Ни один компонент JSF «все в одном» не приходит на ум.

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

Есть ли какая-то причина, по которой вам нужно принимать HTML вместо какого-либо другого языка разметки, например, уценки (именно это использует StackOverflow)?

http://daringfireball.net/projects/markdown/

Не уверен, какой тип тегов вы бы хотели принять, чтобы он не охватывался md или подобным языком форматирования ...

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