module ActionView::Helpers::SanitizeHelper
Вспомогательные методы очистки Action View
Модуль SanitizeHelper предоставляет набор методов для удаления нежелательных элементов HTML из текста. Эти вспомогательные методы расширяют Action View, позволяя вызывать их из файлов шаблонов.
Открытые методы экземпляра
# File actionview/lib/action_view/helpers/sanitize_helper.rb, line 117
def sanitize(html, options = {})
self.class.safe_list_sanitizer.sanitize(html, options)&.html_safe
end Очищает входные данные HTML, удаляя все теги и атрибуты, кроме заведомо безопасных.
Также удаляет атрибуты href / src с небезопасными протоколами, такими как javascript:, и защищает от попыток обойти эти фильтры протоколов с помощью ссылок на символы Unicode, ASCII и шестнадцатеричных символов.
По умолчанию используется санитайзер Rails::HTML5::SafeListSanitizer. Дополнительные сведения см. в разделе Санитайзеры HTML для Rails.
Также можно задать собственные правила очистки.
Предупреждение: Добавление запрещённых тегов или атрибутов в списки разрешённых может создать уязвимости в приложении. По возможности используйте списки разрешённых по умолчанию: они составлены с учётом требований безопасности. Если вы считаете, что списки разрешённых по умолчанию следует расширить, создайте задачу в проекте rails-html-sanitizer.
Обратите внимание: очистка пользовательского текста не гарантирует, что полученная разметка будет допустимой или даже правильно сформированной.
Параметры
:tags-
Массив разрешённых тегов.
:attributes-
Массив разрешённых атрибутов.
:scrubber-
Объект Rails::HTML scrubber или Loofah::Scrubber, определяющий собственные правила очистки. Собственный scrubber имеет приоритет над пользовательскими тегами и атрибутами.
Примеры
Обычное использование
<%= sanitize @comment.body %>
Задание собственных списков разрешённых тегов и атрибутов
<%= sanitize @comment.body, tags: %w(strong em a), attributes: %w(href) %>
Задание собственного scrubber 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 %>
Документацию по scrubber-ам Rails::HTML см. в разделе Rails HTML Sanitizer.
Задание собственного Loofah::Scrubber
scrubber = Loofah::Scrubber.new do |node| node.remove if node.name == 'script' end
<%= sanitize @comment.body, scrubber: scrubber %>
Дополнительные сведения о создании собственных объектов Loofah::Scrubber см. в документации Loofah.
Глобальная конфигурация
Чтобы задать разрешённые по умолчанию теги или атрибуты для всего приложения:
# 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 122 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 156 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 139 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.