2010-10-14 13 views
44

szyny 3 wydaje się uciec wszystko, w tym html. Próbowałem używać raw(), ale nadal ucieka html. Czy jest w pobliżu praca? To jest mój pomocnik, który używam (/helpers/application_helper.rb):Nie uciekaj html w rubinach na szynach

module ApplicationHelper 
    def good_time(status = true) 
    res = "" 
    if status == true 
     res << "Status is true, with a long message attached..." 
    else 
     res << "Status is false, with another long message" 
    end 
    end 
end 

Wołam pomocnika moim zdaniem przy użyciu tego kodu:

<%= raw(good_time(true)) %> 

Odpowiedz

80

Można użyć .html_safe takiego:

def good_time(status = true) 
    if status 
    "Status is true, with a long message attached...".html_safe 
    else 
    "Status is false, with another long message".html_safe 
    end 
end 

<%= good_time(true) %> 
+1

Dzięki! Dowiedziałem się, jak to naprawić zaraz po tym, jak napisałem pytanie, ale jest to o wiele bardziej eleganckie i uproszczone. – alexy13

+10

Znakomita odpowiedź. Nawet 15-minutowe samouczki zawsze zaskakują mnie, jak trudne są niektóre z najbardziej trywialnych zadań w Railsach. Posiadanie buldożera jest dobre i dobre, ale są chwile, wszystko czego potrzebujesz to widelec do krewetek. :) –

3

wpadłem na tej samej rzeczy i odkrył bezpieczniejsze rozwiązanie niż korzystanie html_safe, zwłaszcza gdy wprowadzenie ciągów, które są dynamiczne.

pierwsze, zaktualizowany kod:

def good_time(long_message1, long_message2, status = true) 
    html = "".html_safe 
    html << "Status is #{status}, " 
    if status 
    html << long_message1 
    else 
    html << long_message2 
    end 
    html 
end 

<%= good_time(true) %> 

Ten ucieka long_message treść, która jest niebezpieczna, ale pozostawia Niecytowany czy jest to bezpieczne.

Umożliwia to wyświetlanie prawidłowego wyświetlania "long message for success & such.", ale także wymazywanie "malicious message <script>alert('foo')</script>".

Wyjaśnienie sprowadza się do tego - 'foo'.html_safe zwraca ActiveSupport :: SafeBuffer który działa jak struna pod każdym względem z wyjątkiem jednego: Podczas dołączania ciąg do SafeBuffer (poprzez wywołanie + lub < <), że inny zespół jest escaped HTML przed dołączeniem do SafeBuffer. Po dodaniu innego programu SafeBuffer do programu SafeBuffer nie będzie można uniknąć jego użycia. Railsy renderują wszystkie twoje widoki pod maską za pomocą SafeBuffers, więc zaktualizowana metoda powyżej kończy się dostarczaniem Rails z SafeBuffer, który kontrolujemy, aby wykonać escaping na long_message "w razie potrzeby" zamiast "zawsze".

Teraz zasługa tej odpowiedzi pochodzi wyłącznie od Henninga Kocha i jest opisana znacznie dokładniej pod numerem Everything you know about html_safe is wrong - moje podsumowanie powyżej próbuje jedynie podać istotę wyjaśnienia w przypadku, gdy ten link kiedykolwiek umrze.

+0

To nie ma większego sensu, ponieważ ucieknie * all * HTML w 'long_message1' i' long_message2'. Pytający wydaje się chcieć dopuścić trochę HTML. Może to zrobić, wywołując '.html_safe' na łańcuchu, ale oczywiście powinien to zrobić tylko, jeśli może ufać ciągowi znaków. To, co sugerujesz, nie zezwala na żaden HTML, a wszystkie zostaną ujęte. Proszę popraw mnie jeżeli się mylę. – Mischa

+0

@Mischa To nie usuwa wszystkich HTML w 'long_message1' i' long_message2' - to cały punkt. :-) Metoda konkatenacji SafeBuffer ucieka tylko przed treścią, jeśli jest niebezpieczna. W mojej odpowiedzi dołączam przykład z '&', który jest poprawnie * nie * uciekł, i wyświetla jako '&' (nie '&'). Ponadto, jeśli chcesz uzyskać więcej przykładów i szczegółów, zwróć uwagę na pełne wyjaśnienie Henninga Kocha. – DreadPirateShawn

+0

Dzięki. Sądzę, że muszę przyjrzeć się dokładniej SafeBuffer. Zastanawiam się, jak określa to, co jest bezpieczne, a co nie. Na przykład, jeśli pytający chce mieć link w swojej wiadomości? Czy pozwoliłoby to na twoje wdrożenie? – Mischa

Powiązane problemy