Я опаздываю на вечеринку, но я добавляю дополнительное объяснение тому, что делает 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!
Избегая потенциально испорченных данных, предоставленных пользователем, мы освобождаемся от ответственности!