raw против html_safe против h до unescape html - PullRequest
314 голосов
/ 23 ноября 2010

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

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

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

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

?

Ответы [ 6 ]

381 голосов
/ 23 ноября 2010

Рассматривая Rails 3:

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

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

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

" SafeBuffers и Rails 3.0 "- хорошее объяснение того, как работает SafeBuffer s (класс, который использует магию html_safe).

109 голосов
/ 13 сентября 2012

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

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

вставит:

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

в ваш источник HTML (да, так безопасно!), А:

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

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

45 голосов
/ 10 августа 2013

Разница между Rails ’html_safe() и raw(). Иегуда Кац написал отличную статью, которая действительно сводится к следующему:

def raw(stringish)

  stringish.to_s.html_safe

end

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

См. " html_safe Rails против raw ".

26 голосов
/ 26 сентября 2016
  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 и выше он используется по умолчанию, поэтому вам не нужно явно использовать этот метод

9 голосов
/ 01 сентября 2017

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

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

1 голос
/ 26 августа 2015

В терминах Simple Rails:

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

html_safe устанавливает логическое значение в строке, чтобы строкасчитается html save

raw Преобразуется в html_safe в строку

...