Что означает «h» в «<% = h [...]%>»? - PullRequest
61 голосов
/ 17 ноября 2008

Когда я создаю скаффолд по умолчанию, теги отображения на show.html.erb имеют

<%=h @broker.name %>

Я знаю разницу между <% и <%=. Что делает "ч"?

Ответы [ 6 ]

93 голосов
/ 17 ноября 2008

html escape. Это метод, который преобразует такие вещи, как <и>, в числовые ссылки на символы, чтобы рендеринг не нарушал ваш HTML.

15 голосов
/ 18 ноября 2008

<%=h на самом деле происходит 2 вещи. Вы открываете тег erb (<%=) и вызываете метод Rails h, чтобы экранировать все символы.

Эти два вызова эквивалентны:

<%=h person.first_name %>
<%= h(person.first_name) %>

Метод h обычно используется для экранирования HTML и Javascript из форм пользовательского ввода.

13 голосов
/ 19 ноября 2008

h - псевдоним метода для html_escape из класса ERB :: Util .

6 голосов
/ 29 мая 2009

В Rack также есть метод экранирования HTML Rack::Utils.escape_html, если вы находитесь в Metal и хотите экранировать некоторый HTML.

1 голос
/ 03 марта 2017

Я опаздываю на вечеринку, но я добавляю дополнительное объяснение тому, что делает html_escape, чтобы, надеюсь, помочь другим новичкам, таким как я, понять, что происходит. Rails 3 и более поздние версии теперь автоматически выходят из всех выходных данных, поэтому гораздо меньше ситуаций, когда потребуется html_escape aka h(). Наиболее заметным из них является случай, когда вы собираетесь использовать метод html_safe при создании ссылок с помощью html в классе докладчика и т. Д. Например:

#some_view.html.erb
<span><%= @user.name %></span>  #This is 100% fine and will be automatically escaped by Rails 3+
#Output =>  <span>Brian Kunzig</span>

#Now say we want a link with html that we need preserved!  OMG WHAT ARE DO??
<%=link_to "<span><i class='fa fa-user'></i>#{@user.name}</span>".html_safe  #DANGER!!!

Ссылка выше может вызвать серьезные проблемы и открыть для вас все виды xss (межсайтовый скриптинг) атак. Самый простой пример: если пользователь сохранил свое имя как "<script>alert('omg');</script>", а вы указали на нем html_safe, на любой странице, отображающей его предполагаемое имя, появится предупреждение «omg»! Это серьезная проблема. Чтобы избежать этого, сделайте:

<%=link_to "<span><i class='fa fa-user'></i>#{h(@user.name)}</span>".html_safe #Winning!

Избегая потенциально испорченных данных, предоставленных пользователем, мы освобождаемся от ответственности!

0 голосов
/ 22 февраля 2018

h - это просто псевдоним html_escape. Это служебный метод, обычно используемый для экранирования html и javascript из пользовательских форм ввода. Он преобразует специальные символы в числовые ссылки на символы, чтобы рендеринг не нарушал ваш HTML.

Например, имеющий

<%= h "<p>Hello World</p>" %>  

выведет

<p>Hello World</p>

как текст для просмотра, абзац не будет применен. это будет закодировано как

&lt;p&gt;Hello World&lt;/p&gt;.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...