В чем смысл "h" в "<% = h [...]%>"?

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

<%=h @broker.name %>

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

Существует также метод в Rack для выхода из HTML Rack::Utils.escape_html в случае, если вы находитесь в металле и хотите избежать некоторого HTML.

Ответ 5

Поздно, но я добавляю еще одно объяснение тому, что 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!

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