Spec-Zone.ru › Ruby on Rails 8.1

модуль ERB::Util

Константы

HTML_ESCAPE
HTML_ESCAPE_ONCE_REGEXP
INVALID_TAG_NAME_FOLLOWING_REGEXP
INVALID_TAG_NAME_START_REGEXP
SAFE_XML_TAG_NAME_REGEXP
TAG_NAME_FOLLOWING_CODEPOINTS
TAG_NAME_REPLACEMENT_CHAR
TAG_NAME_START_CODEPOINTS

Соответствует требованиям XML: www.w3.org/TR/REC-xml/#NT-Name

Публичные методы класса

html_escape_once (s) Показать исходный код
# File activesupport/lib/active_support/core_ext/erb/util.rb, line 63
def html_escape_once(s)
  s.to_s.gsub(HTML_ESCAPE_ONCE_REGEXP, HTML_ESCAPE).html_safe
end

Вспомогательный метод для экранирования HTML, не затрагивающий уже экранированные сущности.

html_escape_once('1 < 2 &amp; 3')
# => "1 &lt; 2 &amp; 3"

html_escape_once('&lt;&lt; Accept & Checkout')
# => "&lt;&lt; Accept &amp; Checkout"
json_escape (s) Показать исходный код
# File activesupport/lib/active_support/core_ext/erb/util.rb, line 124
def json_escape(s)
  result = s.to_s.dup
  result.gsub!(">", '\u003e')
  result.gsub!("<", '\u003c')
  result.gsub!("&", '\u0026')
  result.gsub!("\u2028", '\u2028')
  result.gsub!("\u2029", '\u2029')
  s.html_safe? ? result.html_safe : result
end

Вспомогательный метод для экранирования HTML-сущностей в строках JSON. В частности, символы &, > и < заменяются эквивалентными экранированными формами Unicode: u0026, u003e и u003c. Последовательности Unicode u2028 и u2029 также экранируются, поскольку в некоторых движках JavaScript они обрабатываются как символы новой строки. Эти последовательности имеют то же значение, что и исходные символы в контексте строки JSON, поэтому, если входное значение является допустимым и корректно сформированным значением JSON, результат будет иметь эквивалентное значение после разбора:

json = JSON.generate({ name: "</script><script>alert('PWNED!!!')</script>"})
# => "{\"name\":\"</script><script>alert('PWNED!!!')</script>\"}"

json_escape(json)
# => "{\"name\":\"\\u003C/script\\u003E\\u003Cscript\\u003Ealert('PWNED!!!')\\u003C/script\\u003E\"}"

JSON.parse(json) == JSON.parse(json_escape(json))
# => true

Этот метод предназначен для экранирования строк JSON перед их включением в тег script, чтобы избежать уязвимости XSS:

<script>
  var currentUser = <%= raw json_escape(current_user.to_json) %>;
</script>

Необходимо raw результат json_escape, чтобы кавычки не преобразовывались в сущности &quot;. json_escape автоматически не помечает результат как безопасный для HTML, поскольку исходное значение небезопасно для использования в атрибутах HTML.

Если ваш JSON затем используется для вставки в DOM, учитывайте, вставляется ли он с помощью html(). Так работают большинство плагинов jQuery. В этом случае обязательно html_escape или sanitize любой пользовательский контент, возвращаемый вашим JSON.

Если нужно вывести JSON в другом месте HTML, можно просто сделать примерно так: все небезопасные символы (включая кавычки) будут автоматически экранированы:

<div data-user-info="<%= current_user.to_json %>">...</div>

ПРЕДУПРЕЖДЕНИЕ: этот вспомогательный метод работает только с корректным JSON. Его применение к значениям, не являющимся JSON, создаст серьезные уязвимости XSS. Например, если вместо current_user.to_json в приведенном выше примере использовать пользовательский ввод, браузер без проблем eval() эту строку как JavaScript.

Экранирование, выполняемое этим методом, идентично экранированию в кодировщике JSON Active Support, когда ActiveSupport.escape_html_entities_in_json имеет значение true. Поскольку это преобразование идемпотентно, этот вспомогательный метод можно применять, даже если ActiveSupport.escape_html_entities_in_json уже имеет значение true.

Поэтому, если вы не уверены, включен ли ActiveSupport.escape_html_entities_in_json, или не знаете, откуда взялась строка JSON, рекомендуется всегда применять этот вспомогательный метод (другие библиотеки, например гем JSON, по умолчанию не обеспечивают такую защиту; кроме того, некоторые гемы могут переопределять to_json, чтобы обходить кодировщик Active Support).

xml_name_escape (name) Показать исходный код
# File activesupport/lib/active_support/core_ext/erb/util.rb, line 142
def xml_name_escape(name)
  name = name.to_s
  return "" if name.blank?
  return name if name.match?(SAFE_XML_TAG_NAME_REGEXP)

  starting_char = name[0]
  starting_char.gsub!(INVALID_TAG_NAME_START_REGEXP, TAG_NAME_REPLACEMENT_CHAR)

  return starting_char if name.size == 1

  following_chars = name[1..-1]
  following_chars.gsub!(INVALID_TAG_NAME_FOLLOWING_REGEXP, TAG_NAME_REPLACEMENT_CHAR)

  starting_char << following_chars
end

Вспомогательный метод для экранирования XML-имен тегов и атрибутов.

xml_name_escape('1 < 2 & 3')
# => "1___2___3"

Соответствует требованиям спецификации: www.w3.org/TR/REC-xml/#NT-Name

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API