html_safe
gibi hissediyor
örneğin, ne olup bittiğini anlamayı gerektirir String sınıfına bir soyutlama, söylediğimiz eğerNeden Rails 3, <% = note.html_safe%> ve <% = h note.html_safe%> aynı sonucu veriyor?
4. satırda için<%= '1 <b>2</b>' %> # gives 1 <b>2</b> in the HTML source code
<%= h '1 <b>2</b>' %> # exactly the same as above
<%= '1 <b>2</b>'.html_safe %> # 1 <b>2</b> in HTML source code
<%= h '1 <b>2</b>'.html_safe %> # exactly the same as above
<%= h (h '1 <b>2</b>') %> # 1 <b>2</b> wont' escape twice
, tamam, biz dize güven ekler - bu Güvende, ama neden kaçamıyoruz? h
ile kaçmak için, dizinin güvensiz olması gerektiği görünüyor. dize h
tarafından kaçmış değilse Yani 1. satırda
, otomatik olarak atlanır. 5 satırında h
iki kez dize kaçamaz - diğer bir deyişle, <
<
değiştirildiğinde sonra, o &lt;
bir kez daha kaçamaz.
html_safe
sadece güvenli olduğunu söyleyerek dizgiye bir bayrağı etiketlediğini düşündüm. Öyleyse, neden
h
bundan kaçmıyor? ne zaman dize sonra,
1) bir dize html_safe ise, h
o
2 kaçamayacak) bir dize html_safe değilse: h
ve html_escape
aslında bayrağını kullanma konusunda işbirliği gibi görünüyor çıktı arabelleğine eklenir, h
tarafından otomatik olarak çıkarılacaktır.
3) h
zaten bir dize kaçtıysa, html_safe
işaretlenir ve bu nedenle, h
tarafından bir kez daha sızmak herhangi bir etki yapmayacaktır. Bu davranış bile Raylar 2.3.10 aynıdır, ama Ruby on 2.3.5 h
aslında çok Raylar 2.3.5 yılında ... iki kez kaçabilir Hat 5 olduğu gibi, ve (, h
basit bir kaçış yöntemidir, ancak bazı nerede 2.3.10 hat boyunca, h
kadar basit değil oldu. ama 2.3.10 oto bir dize kaçış olmaz, ancak bazı nedenlerden dolayı, yöntem html_safe
zaten 2.3.10 için var (hangi amaçla?))
Tam olarak böyle mi çalışıyor? Bence günümüzde bazen çıktıda istediğimiz şeyi alamıyoruz ve değişkenimize html_safe
'u ekliyoruz, ki bu oldukça tehlikeli olabilir, çünkü XSS saldırısını bu şekilde sunabilir, bu yüzden tam olarak nasıl çalıştığını anlamak oldukça önemli olabilir . Yukarıdakiler tam olarak nasıl çalıştığının bir tahmindir. Aslında farklı bir mekanizma olabilir ve bunu destekleyen herhangi bir belge var mı?
ilginç ... "flag" olarak yeni bir class SafeBuffer kullanıyor ... bu yüzden "foobar" .html_safe "aslında orijinal dizinin içeriği ile yeni bir SafeBuffer örneği oluşturacak ve döndürecek ... –