Spec-Zone.ru › Ruby on Rails 5.0

модуль ERB::Util

Константы

HTML_ESCAPE
HTML_ESCAPE_ONCE_REGEXP
JSON_ESCAPE
JSON_ESCAPE_REGEXP

Методы публичного класса

h(s)
Псевдоним для: html_escape
html_escape(s) Показать исходный код
# File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 19
def html_escape(s)
  unwrapped_html_escape(s).html_safe
end

Утилитарный метод для экранирования символов HTML-тегов. Этот метод также имеет псевдоним h.

В ваших шаблонах ERB используйте этот метод для экранирования любых небезопасных данных. Например:

<%= h @person.name %>

puts html_escape('is a > 0 & a < 10?')
# => is a &gt; 0 &amp; a &lt; 10?
Также псевдоним для: h
html_escape_once(s) Показать исходный код
# File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 51
def html_escape_once(s)
  result = ActiveSupport::Multibyte::Unicode.tidy_bytes(s.to_s).gsub(HTML_ESCAPE_ONCE_REGEXP, HTML_ESCAPE)
  s.html_safe? ? result.html_safe : result
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/string/output_safety.rb, line 113
def json_escape(s)
  result = s.to_s.gsub(JSON_ESCAPE_REGEXP, JSON_ESCAPE)
  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 в примере выше на пользовательский ввод, браузер с удовольствием выполнит эту строку как 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, не предоставляют такого рода защиты по умолчанию; также некоторые жемчужины могут переопределить to_json для обхода кодировщика Active Support).

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

Spec-Zone.ru

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