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 %>
?
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
).
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:
<script>alert('Hello!')</script>
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.
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 ".
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
-
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
-
raw
:raw
jest tylko owijkąhtml_safe
. Użyjraw
, jeśli są szanse, że łańcuch będzienil
.raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> ""
-
h
alias dlahtml_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
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!
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
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