raw против html safe против h для unescape html

Предположим, у меня есть следующие строки

@x = "<a href='#'>Turn me into a link</a>"

на мой взгляд, я хочу, чтобы ссылка отображалась. То есть, я не хочу, чтобы все в @x было unescaped и отображалось как строка. В чем разница между использованием

<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>

?

6 ответов


Учитывая Рельсы 3:

html_safe на самом деле" устанавливает строку " как HTML Safe (это немного сложнее, чем это, но в основном это). Таким образом, Вы можете возвращать HTML-Безопасные строки из помощников или моделей по желанию.

h может использоваться только из контроллера или представления, так как он от помощника. Это заставит выход быть экранированным. Это не очень устарело, но вы, скорее всего, больше не будете использовать его: единственное использование - "вернуть"html_safe заявление, довольно необычное.

предваряя ваше выражение с raw фактически эквивалентно вызову to_s между html_safe на нем, но объявляется на хелпере, так же как h, поэтому его можно использовать только на контроллерах и представлениях.

"SafeBuffers и рельсы 3.0" - это хорошее объяснение того, как SafeBuffers (класс, который делает html_safe магия) работы.


думаю, стоит повторить:html_safe тут не HTML-escape вашей строки. Фактически, это предотвратит экранирование вашей строки.

<%= "<script>alert('Hello!')</script>" %>

положим:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;

в ваш источник HTML (yay, так безопасно!), в то время как:

<%= "<script>alert('Hello!')</script>".html_safe %>

появится диалоговое окно предупреждение (вы уверены, что это то, что вы хотите?). Поэтому вы, вероятно, не хотите звонить html_safe на любых введенных пользователем строках.


разница между рельсами'html_safe() и raw(). На этом есть отличный пост Иегуды Каца, и он действительно сводится к этому:

def raw(stringish)

  stringish.to_s.html_safe

end

да raw() обертка вокруг html_safe() это заставляет вход в строку, а затем вызывает html_safe() на нем. Это также тот случай, что raw() является помощником в модуле, тогда как html_safe() - Это метод класса String, который создает новый экземпляр ActiveSupport:: SafeBuffer-который имеет @dirty флаг в он.

смотрите на "Html_safe Rails против raw".


  1. html_safe :

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

    "<a>Hello</a>".html_safe
    #=> "<a>Hello</a>"
    
    nil.html_safe
    #=> NoMethodError: undefined method `html_safe' for nil:NilClass
    
  2. raw :

    raw - это просто обертка вокруг html_safe. Использовать raw Если есть шансы, что эта строка будет nil.

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
    
  3. h псевдоним html_escape :

    метод утилиты для экранирования символов тегов HTML. Используйте этот метод, чтобы избежать любого опасного контента.

    в Rails 3 и выше он используется по умолчанию, поэтому вам не нужно использовать этот метод явно


лучший безопасный способ-это: <%= sanitize @x %>

Это позволит избежать XSS!


в простых терминах рельсы:

h удалите HTML-теги в числовые символы, чтобы рендеринг не нарушил ваш html

html_safe задает логическое значение в строке, чтобы строка рассматривалась как HTML save

raw он преобразуется в html_safe в string