Spec-Zone.ru › Ruby on Rails 7.2

модуль 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)
  ActiveSupport::Multibyte::Unicode.tidy_bytes(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-gem, не предоставляют такого рода защиты по умолчанию; также некоторые gem могут переопределить 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