raw vs. html_safe vs. h to unescape html


323

Aşağıdaki dizeye sahip olduğumu varsayalım

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

Benim görüşüme göre bir bağlantının gösterilmesini istiyorum. Yani, @x içindeki her şeyin kaçınılmasını ve bir dize olarak görüntülenmesini istemiyorum. Kullanma arasındaki fark nedir

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

?


Kimse bundan bahsetmediğim <%== @x %>için, <%= raw(@x) %> edgeguides.rubyonrails.org/…
CTS_AE

Yanıtlar:


386

Raylar 3 dikkate alındığında:

html_safeaslında "dizgiyi" HTML Kasası olarak ayarlar (bundan biraz daha karmaşıktır, ancak temelde budur). Bu şekilde, HTML Safe dizelerini yardımcılardan veya modellerden istediğiniz zaman döndürebilirsiniz.

hyalnızca bir denetleyiciden veya görünümden kullanılabilir, çünkü bir yardımcıdan gelir. Çıktıdan kaçmaya zorlar. Gerçekten itiraz edilmiyor, ancak büyük olasılıkla artık kullanmayacaksınız: Tek kullanım, bir html_safebildirimi "geri döndürmek" , oldukça sıra dışı.

İfadenizi birlikte eklemek rawaslında onunla to_szincirleme çağrıya eşdeğerdir html_safe, ancak tıpkı bir hkontrolörde beyan edilir , bu yüzden sadece kontrolörlerde ve görünümlerde kullanılabilir.

" SafeBuffers and Rails 3.0 " SafeBuffers'nin ( html_safesihri yapan sınıfın) nasıl çalıştığına dair güzel bir açıklama .


42
hBunun hiç reddedileceğini söyleyemem . Kullanımı "Hi<br/>#{h@ user.name}".html_safeoldukça yaygın ve kabul edilen bir kullanımdır.
maletor

1
@Maletor ilginç kullanımı, yine de hala "sıradışı" kategorisine düşüyor düşünüyorum.
Fábio Batista

5
Dize # html_safe aslında orijinal dizeyi saran ve #html_safe olan bir ActiveSupport :: SafeBuffer örneği döndürür. . Orijinal dize #html_safe olmaz? üzerinde #html_safe aradıktan sonra.
jmaxyz

9
Pratikte rawve html_safepratikte küçük bir fark olduğunu unutmayın : raw(nil)boş bir dize döndürürken nil.html_safebir istisna atar.
Van der Hoorn

2
hbir html_safe bildirimini "geri döndürmez". Bir dize olduğunda, html_safe, hhiçbir şey yapacağız.
GuiGS

113

Ben tekrar ayılar düşünüyorum: html_safeyok değil sizin dize HTML kaçış. Aslında, dizenizin kaçmasını önleyecektir.

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

koyacağım:

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

HTML kaynağınıza (yay, çok güvenli!)

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

uyarı iletişim kutusu açılır (istediğiniz şey olduğundan emin misiniz?). Dolayısıyla, muhtemelen html_safekullanıcı tarafından girilen herhangi bir dizeyi aramak istemezsiniz .


81
Başka bir deyişle, html_safe "lütfen bu html'yi güvenli hale getirin" değildir, tam tersidir - "bu dize html güvenlidir, söz verin!"
PaulMurrayCbr

aslında buraya gerçekten unescape yapılıp yapılmadığını ya da sadece to_escape için gerekli olmadığını gösteren bir işaret yaparsa anlamaya geldim . Oldukça büyük bir fark. Oh, o zaman kaynak kodunu okumak için kapalı.
Simon B.

"Html_safe" kavramı sadece dizgideki bir meta bayrağıdır. Şey İşaretleme olarak html_safegelmez değil kaçmak ne de çıkış yapılmış. Bir şeyi HTML için güvenli değil olarak işaretlemenin ve ardından ERB <% = etiketinin örtülü çıkışını kullanmanın sonucu olarak, çıkıştan kaçan verilerle ve ardından çıkışta yeniden kaçmakla aynı olabilir, işlevsel olarak hiçbiri yapmaz. (6 * -1 * -1),
vs.'ye

46

Aradaki fark Rails ' html_safe()ile raw(). Bu konuda Yehuda Katz'ın mükemmel bir yazısı var ve gerçekten buna bağlı:

def raw(stringish)

  stringish.to_s.html_safe

end

Evet, girdiyi raw()String'e html_safe()zorlayan ve daha sonra çağıran bir sarmalayıcıdır html_safe(). Ayrıca, raw()modülde yardımcı olan durumdur, ancak html_safe()String sınıfında, içinde bir @dirtybayrak bulunan yeni bir ActiveSupport :: SafeBuffer örneği yapan bir yöntemdir .

" Rails 'html_safe vs. raw " başlığına bakın .


30
  1. html_safe :

    Bir dizeyi güvenilir kasa olarak işaretler. Ek kaçış yapılmadan HTML'ye eklenir.

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

    rawsadece bir sarıcı html_safe. rawDizenin gerçekleşme olasılığı varsa kullanın nil.

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
  3. hiçin takma ad html_escape:

    HTML etiketi karakterlerinden kaçmak için bir yardımcı yöntem. Güvenli olmayan içerikten kaçmak için bu yöntemi kullanın.

    Rails 3 ve üzeri sürümlerde varsayılan olarak kullanılır, bu nedenle bu yöntemi açıkça kullanmanıza gerek yoktur



2

Basit Raylar terimleriyle:

h html etiketlerini sayı karakterlerine kaldırın, böylece oluşturma html'nizi kırmaz

html_safe dizede bir boolean ayarlar, böylece dize html save olarak kabul edilir

raw Html_safe dizgiye dönüştürür


holduğu html_safeolduğu gibi HTML oluşturulduğunda, yani.
Dave Newton

Cevap doğrudur: h ... html_escape olduğunu Raylar kod tabanından
notapatch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.