Когда я создаю эшафот по умолчанию, теги отображения на show.html.erb имеют
<%=h @broker.name %>
Я знаю разницу между <%
и <%=
. Что делает "h"?
Когда я создаю эшафот по умолчанию, теги отображения на show.html.erb имеют
<%=h @broker.name %>
Я знаю разницу между <%
и <%=
. Что делает "h"?
html escape. Это способ, который преобразует такие вещи, как < и > в числовые ссылки на символы, чтобы рендеринг не нарушил ваш html.
<%=h
на самом деле происходит 2 вещи. Вы открываете тег erb (<%=
) и вызываете метод Rails h
, чтобы избежать всех символов.
Эти два вызова эквивалентны:
<%=h person.first_name %>
<%= h(person.first_name) %>
Метод h
обычно используется для выхода из HTML и Javascript из пользовательских форм ввода.
h
- это псевдоним метода для html_escape
из класса ERB:: Util.
Существует также метод в Rack для выхода из HTML Rack::Utils.escape_html
в случае, если вы находитесь в металле и хотите избежать некоторого HTML.
Поздно, но я добавляю еще одно объяснение тому, что 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!
Удерживая потенциально испорченные данные, предоставленные пользователем, мы свободны!