Bir dizeyi HTML kodlaması / kaçışı nasıl yapılır? Yerleşik var mı?


99

Bir HTML sayfasında metin olarak göstermek istediğim güvenilmeyen bir dizem var. HTML varlıkları olarak ' <' ve ' &' karakterlerinden kaçmam gerekiyor . Ne kadar az telaş o kadar iyi.

UTF8 kullanıyorum ve aksanlı harfler için başka varlıklara ihtiyacım yok.

Ruby veya Rails'de yerleşik bir işlev var mı, yoksa kendim mi almalıyım?


2
OWASP göre , aşağıdaki altı karakter HTML öğesi içeriği uygun XSS koruması için kaçtı edilmelidir:&<>"'/
sffc

Yanıtlar:


96

hYardımcı bir yöntem:

<%=h "<p> will be preserved" %>

Ayrıca, gereksiz olan> kaçar, ama işe yarar.
kch

Bazılarını h ile ve bazılarını olmadan yazdırmak için parantez kullanabilirsiniz. <% = h ("<p") + ">"%>
Trevor Bramble

Şimdi bu aptalca olurdu. Kaçıp kaçmaması pek umurumda değil. Sadece html özelliklerine göre gerekli olmadığını not ediyorum.
kch

12
Bu oluyor bazen nedeniyle ']]>' ( 'KarkVeri' üretimini bakınız) metnin dışına tutulması XML Spec en ziyade can sıkıcı ısrarına XHTML'de gerektiriyordu. Bu, her zaman ondan kaçmayı genellikle daha kolay (ve zararsız) hale getirir.
bobince

20
ilgilenenler hiçinhtml_escape
lightswitch05

141

Ruby CGI sınıfına göz atın . HTML’lerin yanı sıra URL’leri kodlamak ve çözmek için yöntemler vardır.

CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;"

12
Teşekkürler, kontrolörlerden yapılabileceği için bu harika. Tabii ki bunu yapmazdım.
Dan Rosenstark

2
Bu, bir şablona eklenen içeriğin doğruluğunu kontrol etmek için işlevsel / entegrasyon testlerinde kullanışlıdır (içeriğin HTML çıkışlı olduğu varsayıldığında).
Alex D

İçerik, kendi web siteniz dışında (görünümü kontrol edemediğiniz) bir müşterinin web sitesinde görüntüleniyorsa, veritabanına eklemeden önce html'den kaçmanın sorunu nedir? Etrafta başka bir iş var mı?
n00b

Sağ - veritabanına girmeden önce kaçmak harika. Sadece eklemeden önce oradan kaçmamış eski korsanların olmadığından emin olmak istiyorsun ...
Kevin

5
Eşanlamlısı daha çok seviyorum: CGI.escape_html
Trantor Liu

77

Ruby on Rails'de varsayılan olarak 3 HTML öncelenecektir.

Kaçışsız dizeler için şunu kullanın:

<%= raw "<p>hello world!</p>" %>

25

ERB :: Util.html_escape her yerde kullanılabilir. requireRaylarda kullanılmadan mevcuttur .


bu aslında CGI.escapeHTMLaltını kullanıyor
akostadinov

@akostadinov - sonuç farklı. Örneğin, ERB :: Util.html_escape kesme işaretlerini & # x27; oysa CGI :: escapeHTML olmayacak
Louis Sayers

@LouisSayers, bunun nasıl olabileceğini anlayamıyorum: `` [43] pry (ana)> show-source ERB :: Util.html_escape Gönderen: /usr/share/ruby/erb.rb @ line 945: Owner : # <Class: ERB :: Util> Görünürlük: public Satır sayısı: 3 def html_escape (s) CGI.escapeHTML (s.to_s) end ``
akostadinov

@akostadinov - hmm ... Tekrar koştular ve evet, aynı çıktıyı ürettiler. Bunu işte çalıştırdığımda bunun farklı sonuçlar verdiğine yemin ederim (belki farklı erb / cgi sürüm davranışı?). Yarın işte neden farklı bir sonuç aldığımı görmem gerekecek.
Louis Sayers

17

Christopher Bradford'un HTML kaçışını herhangi bir yerde kullanma yanıtına bir ek, CGIgünümüzde çoğu insan kullanmadığından , şunu da kullanabilirsiniz Rack:

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')

Model örnek yöntemlerinde dizelerden benzer şekilde kaçmanın daha iyi bir yolu var mı?
Kodlama aktif

16

Sen kullanabilir ya edebilir h()ya html_escape(), ama çoğu insan kullanmak h()Kongre tarafından. rayların h()kısaltmasıdır html_escape().

Denetleyicinizde:

@stuff = "<b>Hello World!</b>"

Size göre:

<%=h @stuff %>

HTML kaynağını görüntülerseniz: çıktıyı veriyi gerçekten kalınlaştırmadan görürsünüz. Yani kodlanmıştır &lt;b&gt;Hello World!&lt;/b&gt;.

Olarak görünecek <b>Hello World!</b>


10

Farklı yöntemlerin karşılaştırılması:

> CGI::escapeHTML("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote &#x27; double quotes &quot;"

> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

Rails ActiveMailer kaçışıyla uyumlu olması için kendim yazdım:

def escape_html(str)
  CGI.escapeHTML(str).gsub("&#39;", "'")
end

0

h() tırnak işaretlerinden kaçmak için de kullanışlıdır.

Örneğin, bir metin alanı kullanarak bir bağlantı oluşturan bir görünüme sahibim result[r].thtitle. Metin, tek tırnak işaretleri içerebilir. Ben kaçmak olmadıysa result[r].thtitleonayla yönteminde, JavaScript kıracak:

&lt;%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource,
:action         =>:delete_resourced,
:id     => result[r].id,
:th     => thread,                                                                                                      
:html       =>{:title=> "<= Remove"},                                                       
:confirm    => h("#{result[r].thtitle} will be removed"),                                                   
:method     => :delete %>

&lt;a href="#" onclick="if (confirm('docs: add column &amp;apos;dummy&amp;apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&amp;th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="&lt;= Remove">docs: add column 'dummy'</a>

Not: :htmlbaşlık beyanı, Rails tarafından sihirli bir şekilde atlanır.

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.