модуль ActionView::Helpers::SanitizeHelper
Модуль Action View Sanitize Helpers
Модуль SanitizeHelper предоставляет набор методов для очистки текста от нежелательных HTML-элементов. Эти вспомогательные методы расширяют Action View, делая их вызываемыми в ваших шаблонах.
Публичные методы экземпляра
# File actionview/lib/action_view/helpers/sanitize_helper.rb, line 111
def sanitize(html, options = {})
self.class.safe_list_sanitizer.sanitize(html, options)&.html_safe
end Очищает HTML-входные данные, удаляя все, кроме известных безопасных тегов и атрибутов.
Также удаляет атрибуты href / src с небезопасными протоколами, такими как javascript:, а также защищает от попыток использовать Unicode, ASCII и шестнадцатеричные ссылки на символы для обхода этих фильтров протоколов.
По умолчанию используется Rails::HTML5::SafeListSanitizer очиститель. Дополнительную информацию см. в Rails HTML Sanitizers.
Также могут быть предоставлены пользовательские правила очистки.
Обратите внимание, что очистка пользовательского текста не гарантирует, что полученная разметка будет валидной или даже правильно сформированной.
Параметры
-
:tags -
Массив разрешенных тегов.
-
:attributes -
Массив разрешенных атрибутов.
-
:scrubber -
Объект Rails::HTML очиститель или Loofah::Scrubber, определяющий пользовательские правила очистки. Пользовательский очиститель имеет приоритет над пользовательскими тегами и атрибутами.
Примеры
Нормальное использование
<%= sanitize @comment.body %>
Предоставление пользовательских списков разрешенных тегов и атрибутов
<%= sanitize @comment.body, tags: %w(strong em a), attributes: %w(href) %>
Предоставление пользовательского Rails::HTML очистителя
class CommentScrubber < Rails::HTML::PermitScrubber
def initialize
super
self.tags = %w( form script comment blockquote )
self.attributes = %w( style )
end
def skip_node?(node)
node.text?
end
end
<%= sanitize @comment.body, scrubber: CommentScrubber.new %>
См. Rails HTML Sanitizer для документации по Rails::HTML очистителям.
Предоставление пользовательского Loofah::Scrubber
scrubber = Loofah::Scrubber.new do |node| node.remove if node.name == 'script' end
<%= sanitize @comment.body, scrubber: scrubber %>
См. документацию Loofah для получения дополнительной информации о определении пользовательских Loofah::Scrubber объектов.
Глобальная настройка
Для установки по умолчанию разрешенных тегов или атрибутов во всем приложении:
# In config/application.rb config.action_view.sanitized_allowed_tags = ['strong', 'em', 'a'] config.action_view.sanitized_allowed_attributes = ['href', 'title']
По умолчанию, начиная с Rails 7.1, используется HTML5-парсер для очистки (если он доступен, см. ПРИМЕЧАНИЕ ниже). Если вы хотите вернуться к предыдущему поведению HTML4, вы можете сделать это, установив следующее в конфигурации приложения:
# In config/application.rb config.action_view.sanitizer_vendor = Rails::HTML4::Sanitizer
Или, если вы обновляете с предыдущей версии Rails и хотите воспользоваться поведением HTML5:
# In config/application.rb config.action_view.sanitizer_vendor = Rails::HTML5::Sanitizer
ПРИМЕЧАНИЕ: Rails::HTML5::Sanitizer не поддерживается в JRuby, поэтому на платформах JRuby Rails будет использовать Rails::HTML4::Sanitizer.
# File actionview/lib/action_view/helpers/sanitize_helper.rb, line 116 def sanitize_css(style) self.class.safe_list_sanitizer.sanitize_css(style) end
Очищает блок кода CSS. Используется методом sanitize при обнаружении атрибута style.
# File actionview/lib/action_view/helpers/sanitize_helper.rb, line 150 def strip_links(html) self.class.link_sanitizer.sanitize(html) end
Удаляет все теги ссылок из html, оставляя только текст ссылки.
strip_links('<a href="http://www.rubyonrails.org">Ruby on Rails</a>')
# => Ruby on Rails
strip_links('Please e-mail me at <a href="mailto:me@email.com">me@email.com</a>.')
# => Please e-mail me at me@email.com.
strip_links('Blog: <a href="http://www.myblog.com/" class="nav" target=\"_blank\">Visit</a>.')
# => Blog: Visit.
strip_links('<<a href="https://example.org">malformed & link</a>')
# => <malformed & link
# File actionview/lib/action_view/helpers/sanitize_helper.rb, line 133 def strip_tags(html) self.class.full_sanitizer.sanitize(html)&.html_safe end
Удаляет все HTML-теги из html, включая комментарии и специальные символы.
strip_tags("Strip <i>these</i> tags!")
# => Strip these tags!
strip_tags("<b>Bold</b> no more! <a href='more.html'>See more here</a>...")
# => Bold no more! See more here...
strip_tags("<div id='top-bar'>Welcome to my website!</div>")
# => Welcome to my website!
strip_tags("> A quote from Smith & Wesson")
# => > A quote from Smith & Wesson
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.