модуль ERB::Util
Константы
- HTML_ESCAPE
- HTML_ESCAPE_ONCE_REGEXP
- JSON_ESCAPE
- JSON_ESCAPE_REGEXP
Публичные методы класса
# File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 20 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 > 0 & a < 10? # File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 52 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 & 3')
# => "1 < 2 & 3"
html_escape_once('<< Accept & Checkout')
# => "<< Accept & Checkout"
# File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 114 def json_escape(s) result = s.to_s.gsub(JSON_ESCAPE_REGEXP, JSON_ESCAPE) s.html_safe? ? result.html_safe : result end
Утилитарный метод для экранирования HTML-сущностей в строках JSON. В частности, символы &, > и < заменяются на эквивалентные юникод-экранированные формы - 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 перед включением их внутри тега скрипта для предотвращения уязвимости XSS:
<script> var currentUser = <%= raw json_escape(current_user.to_json) %>; </script>
Необходимо raw результат json_escape, чтобы кавычки не преобразовывались в " сущности. 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, не обеспечивают такого рода защиты по умолчанию; также некоторые драгоценные камни могут переопределять to_json для обхода кодировщика Active Support).
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.