экранировать вывод HTML, но без разрывов строк - PullRequest
4 голосов
/ 01 ноября 2010

У меня есть текстовое поле описания в моей модели. Нет, я хочу добавить это описание на странице шоу. Но текст выглядит безобразно из-за отсутствия разрывов строк.

Если я заменю их на <br/>, то рельсы избегают их. Поэтому я попытался использовать метод raw (). Я хочу избежать плохого HTML, но в выводе есть разрывы строк.

Я получаю некрасивый код.

raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>"))

Есть ли у вас какие-либо предложения?

Ответы [ 4 ]

14 голосов
/ 12 января 2011

вы должны использовать помощник simple_format:

<%= simple_format @place.description %>

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

2 голосов
/ 28 ноября 2013

3 года спустя, но никогда не поздно предоставить хорошее рабочее решение

Это позволит избежать всех символов HTML, кроме символов новой строки (совместимых с Linux, Windows и Mac)

html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe
2 голосов
/ 01 ноября 2010

это то, что вы ищете

@place.description.html_safe.gsub("\n", '<br/>')

? Но, если подумать, разве такое использование html_safe не облегчает сайту атаку XSS? (поскольку предполагается, что description безопасно).

Так что лучшим решением не будет

<%= (h @place.description).gsub("\n", '<br/>') %>

сначала я подумал

<%= (h @place.description).gsub("\n", '<br/>'.html_safe) %>

требуется, но на самом деле обе версии работают. Затем я протестировал, добавив некоторые HTML-теги в description, и он был экранирован в &lt; и т. Д., Поэтому он предотвращает атаку XSS.

1 голос
/ 28 января 2013

Вот решение, которое работает:

<%= sanitize(@place.description.gsub("\n", "<br />"), :tags => %w(br), :attributes => %w()) %>

Дополнительная литература:

Анализ символов новой строки в текстовых областях без разрешения всех тегов html

Документация:

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

Из sanitize:

Этот помощник sanitize будет html кодировать все теги и удалять все атрибуты, которые специально не разрешены.

Он также удаляет теги href / src с недопустимыми протоколами, такими как javascript: особенно.Он делает все возможное, чтобы противостоять любым трюкам, которые могут использовать хакеры, например, добавление значений unicode / ascii / hex для обхода фильтров javascript :.Ознакомьтесь с расширенным набором тестов.

Вы можете указать разрешенные теги с опцией: tags, а атрибуты с опцией: attribute.

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