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 nieskalowane i wyświetlane jako ciąg. Jaka jest różnica między używaniem
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
ruby-on-rails
erb
grautur
źródło
źródło
<%== @x %>
alias<%= raw(@x) %>
edgeguides.rubyonrails.org/…Odpowiedzi:
Biorąc pod uwagę szyny 3:
html_safe
w rzeczywistości „ustawia ciąg” jako Bezpieczny HTML (jest to trochę bardziej skomplikowane, ale w zasadzie to jest to). W ten sposób możesz dowolnie zwracać ciągi znaków Bezpieczne HTML od pomocników lub modeli.h
może być używany tylko z poziomu kontrolera lub widoku, ponieważ pochodzi od pomocnika. Zmusi to wyjście do ucieczki. Nie jest tak naprawdę przestarzałe, ale najprawdopodobniej już go nie użyjesz: jedynym sposobem jest „przywrócenie”html_safe
deklaracji, co jest dość niezwykłe.Przygotowanie wyrażenia za pomocą w
raw
rzeczywistości jest równoważne wywołaniuto_s
połączonemu zhtml_safe
nim, ale jest zadeklarowane w pomocniku, podobnie jakh
, więc można go używać tylko w kontrolerach i widokach.„ SafeBuffers and Rails 3.0 ” to miłe wytłumaczenie tego, jak działa
SafeBuffer
s (klasa, która wykonujehtml_safe
magię).źródło
h
to będzie przestarzałe. Używanie"Hi<br/>#{h@ user.name}".html_safe
jest dość powszechne i akceptowane.raw
ihtml_safe
w praktyce:raw(nil)
zwraca pusty ciąg, anil.html_safe
zgłasza wyjątek.h
nie „przywróci” deklaracji html_safe. Gdy łańcuch jesthtml_safe
,h
nic nie zrobi.Myślę, że to wyraźnie podkreślić:
html_safe
nie nie HTML-uciec swój ciąg. W rzeczywistości zapobiegnie to ucieczce łańcucha.położy:
do twojego źródła HTML (tak, więc bezpiecznie!), a jednocześnie:
pojawi się okno dialogowe alertu (jesteś pewien, że tego właśnie chcesz?). Prawdopodobnie nie chcesz wywoływać
html_safe
żadnych ciągów wprowadzonych przez użytkownika.źródło
html_safe
ma nie uciekać ani unescape. Choć wynik końcowy oznaczania coś co nie HTML bezpieczne, a następnie przy użyciu niejawny cytowanie ERB <% = znacznika, może być taka sama jak unescaping danych, a następnie ponownie go uciekając na wyjściu, funkcjonalnie to robi ani. Coś jak różnica (6 * -1 * -1), w porównaniu z 6.Różnica polega między Railsami
html_safe()
araw()
. Jest na ten temat świetny post Yehuda Katza, który naprawdę sprowadza się do tego:Tak,
raw()
jest otoczką,html_safe()
która wymusza wejście do String, a następnie wywołujehtml_safe()
ją. Jest tak również w przypadkuraw()
pomocnika w module, podczas gdyhtml_safe()
jest to metoda klasy String, która tworzy nową instancję ActiveSupport :: SafeBuffer - która ma@dirty
flagą.Zobacz sekcję „ Rails 'html_safe vs. raw ”.
źródło
html_safe
:Oznacza ciąg jako zaufany bezpieczny. Zostanie on wstawiony do HTML bez wykonywania dodatkowych znaków zmiany znaczenia.
raw
:raw
to tylko opakowaniehtml_safe
. Użyj,raw
jeśli istnieją szanse, że będzie ciągnil
.h
alias dlahtml_escape
:Metoda narzędziowa do zmiany znaczenia znaczników HTML. Użyj tej metody, aby uniknąć niebezpiecznych treści.
W Railsach 3 i nowszych jest on używany domyślnie, więc nie musisz jawnie używać tej metody
źródło
Najlepszym bezpiecznym sposobem jest:
<%= sanitize @x %>
Pozwoli to uniknąć XSS!
źródło
W prostych słowach:
h
usuń tagi html na znaki liczbowe, aby renderowanie nie uszkodziło htmlhtml_safe
ustawia ciąg boolean w taki sposób, aby traktowany był jako zapis htmlraw
Konwertuje na html_safe na stringźródło
h
jesthtml_safe
, co oznacza, że HTML jest renderowany „tak jak jest”.