raw vs. html safe VS. h to unescape html

Załóżmy, że mam następujący ciąg

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

Moim zdaniem chcę aby link był wyświetlany. Oznacza to, że nie chcę, aby wszystko w @x było unescaped i wyświetlane jako ciąg znaków. Jaka jest różnica między używaniem

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

?

Author: jergason, 2010-11-23

6 answers

Rozważając Rails 3:

html_safe w rzeczywistości "ustawia ciąg" jako bezpieczny HTML(jest to trochę bardziej skomplikowane, ale to w zasadzie to). W ten sposób możesz zwracać bezpieczne ciągi HTML z helperów lub modeli do woli.

h może być używany tylko z kontrolera lub widoku, ponieważ pochodzi z helpera. Wymusi to ucieczkę wyjścia. Nie jest tak naprawdę przestarzały, ale najprawdopodobniej już go nie użyjesz: jedynym użyciem jest "przywrócenie" html_safe deklaracji, pretty niezwykłe.

Poprzedzające wyrażenie raw jest w rzeczywistości równoważne wywołaniu to_s przykutemu z html_safe na nim, ale jest zadeklarowane na helperze, podobnie jak h, więc może być używane tylko na kontrolerach i widokach.

"SafeBuffers and Rails 3.0" jest miłym wyjaśnieniem, jak działa SafeBuffer S (klasa, która wykonuje magię html_safe).

 375
Author: Fábio Batista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-14 01:03:20

Myślę, że to powtarza: html_safe Czy nie HTML-escape your string. W rzeczywistości zapobiegnie to ucieczce twojego Sznurka.

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

Umieści:

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

Do źródła HTML (yay, so safe!), while:

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

Pojawi się okno dialogowe alertu (czy na pewno tego chcesz?). Więc prawdopodobnie nie chcesz wywoływać html_safe Na żadnych wprowadzonych przez użytkownika ciągach znaków.

 106
Author: roasm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-29 18:57:16

Różnica jest między Rails ' html_safe() i raw(). Jest doskonały post Yehuda Katz na ten temat, i to naprawdę sprowadza się do tego:

def raw(stringish)

  stringish.to_s.html_safe

end

Tak, raw() jest opakowaniem wokół html_safe(), które wymusza wejście na String, a następnie wywołuje na nim html_safe(). Jest też tak, że {[2] } jest helperem w module, podczas gdy {[1] } jest metodą na klasie String, która tworzy nową instancję ActiveSupport:: SafeBuffer-która ma flagę @dirty.

Zobacz " Rails ' html_safe vs. raw ".

 42
Author: Pankhuri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 23:53:42
  1. html_safe :

    Oznacza łańcuch jako zaufany sejf. Zostanie on wstawiony do HTML bez wykonywania dodatkowych operacji specjalnych.

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

    raw jest tylko owijką html_safe. Użyj raw, jeśli są szanse, że łańcuch będzie nil.

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
    
  3. h alias dla html_escape :

    Metoda użytkowa do usuwania znaków znaczników HTML. Użyj tej metody, aby uciec od wszelkich niebezpieczne treści.

    W Rails 3 i wyżej jest używana domyślnie, więc nie musisz używać tej metody jawnie

 23
Author: Deepak Mahakale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-26 14:59:37

Najlepszy bezpieczny sposób to: <%= sanitize @x %>

Uniknie XSS!

 5
Author: Guilherme Y. Hatano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-31 23:00:31

W terminach Simple Rails:

h usuń znaczniki html na znaki liczbowe, aby renderowanie nie złamało twojego html

html_safe ustawia wartość logiczną w łańcuchu tak, aby łańcuch był traktowany jako html save

raw konwertuje do html_safe na string

 1
Author: user3118220,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 08:35:32