2010-11-01 3 views
9

यह html_safe की तरह लगता है स्ट्रिंग वर्ग के लिए एक अमूर्त क्या, चल रहा है, उदाहरण के लिए की समझ की आवश्यकता है कि,क्यों रेल 3 में, <% = note.html_safe%> और <% = ज note.html_safe%> एक ही परिणाम दे सकता है?

<%= '1 <b>2</b>' %>  # gives 1 &lt;b&gt;2&lt;/b&gt; 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 &lt;b&gt;2&lt;/b&gt; wont' escape twice 

लाइन 4 के लिए, यदि हम कह रहे हैं, ठीक है, हम स्ट्रिंग पर भरोसा कहते हैं - यह सुरक्षित है, लेकिन हम इसे क्यों नहीं निकाल सकते? ऐसा नहीं है कि h से यह बच रहा है, स्ट्रिंग असुरक्षित हो गया है।

तो पंक्ति 1 पर

, अगर स्ट्रिंग h सहायता से निकले नहीं है, यह स्वचालित रूप से छोड़ दिया जाएगा। लाइन 5 पर, h स्ट्रिंग से दो बार नहीं बच सकता - दूसरे शब्दों में, < के बाद &lt; में बदल दिया गया है, यह &amp;lt; पर इसे और अधिक नहीं बचा सकता है।

तो क्या हो रहा है? सबसे पहले, मैंने सोचा था कि html_safe सिर्फ स्ट्रिंग के लिए एक ध्वज टैगिंग है, कह रही है कि यह सुरक्षित है। तो फिर, h क्यों नहीं बचता है? ऐसा लगता है कि h और html_escape वास्तव में ध्वज का उपयोग पर सहयोग:

1) एक स्ट्रिंग html_safe है, तो h यह

2 से बच नहीं होगा) यदि एक स्ट्रिंग html_safe नहीं है जब स्ट्रिंग, तो उत्पादन बफर में जोड़ा जाता है, यह स्वतः ही h से छोड़ दिया जाएगा।

3) यदि h पहले से ही एक स्ट्रिंग से बच निकला है, तो इसे html_safe चिह्नित किया गया है, और इसलिए h द्वारा इसे एक और समय से बचने से कोई प्रभाव नहीं पड़ेगा। (लाइन 5 के रूप में, और यह व्यवहार रेल 2.3.10 में भी समान है, लेकिन रेल पर 2.3.5 h वास्तव में इसे दो बार से बच सकता है ... इसलिए रेल 2.3.5, h में एक साधारण भागने का तरीका है, लेकिन कुछ जहां 2.3.10 को रेखा के साथ, h के रूप में सरल नहीं हो गया। लेकिन 2.3.10 ऑटो एक स्ट्रिंग से बच नहीं होगा, लेकिन किसी कारण से, विधि html_safe पहले से ही 2.3.10 के लिए मौजूद है (क्या प्रयोजन के लिए?))

कैसे यह वास्तव में काम करता है कि है? मुझे आजकल लगता है, कभी-कभी हम आउटपुट में जो चाहते हैं उसे प्राप्त नहीं करते हैं और हम तुरंत हमारे चरम पर html_safe जोड़ते हैं, जो काफी खतरनाक हो सकता है, क्योंकि यह एक्सएसएस हमले को इस तरह पेश कर सकता है, इसलिए यह समझना कि यह वास्तव में कैसे काम करता है । उपर्युक्त केवल अनुमान है कि यह वास्तव में कैसे काम करता है। क्या यह वास्तव में एक अलग तंत्र हो सकता है और क्या कोई ऐसा दस्तावेज़ है जो इसका समर्थन करता है?

उत्तर

6

आप देख सकते हैं, एक स्ट्रिंग पर html_safe बुला एक एचटीएमएल सुरक्षित SafeBuffer

http://github.com/rails/rails/blob/89978f10afbad3f856e2959a811bed1982715408/activesupport/lib/active_support/core_ext/string/output_safety.rb#L87

एक SafeBuffer पर कोई कार्य है कि स्ट्रिंग सुरक्षा को प्रभावित कर सकता है में बदल जाता ज के माध्यम से पारित हो जाएगा()

ज इस ध्वज का उपयोग करता बचने डबल से बचने के लिए

http://github.com/rails/rails/blob/89978f10afbad3f856e2959a811bed1982715408/activesupport/lib/active_support/core_ext/string/output_safety.rb#L18

व्यवहार बदल गया और मुझे लगता है कि यह काम करता है कि यह कैसे काम करता है। आम तौर पर आपको html_safe को कॉल नहीं करना चाहिए जबतक कि आप सुनिश्चित न हों कि यह पहले ही स्वीकृत है।कुछ भी की तरह, आप जबकि यह

+1

दिलचस्प ... यह एक नया वर्ग सेफबफर का उपयोग "ध्वज" के रूप में करता है ... इसलिए '"foobar" .html_safe' वास्तव में मूल स्ट्रिंग की सामग्री के साथ सेफबफर का एक नया उदाहरण बना देगा और वापस करेगा ... –

0

का उपयोग कर रेल 3 में सावधान रहना होगा, सभी उत्पादन डिफ़ॉल्ट रूप से h सहायक उपयोग कर रहा है

http://origami.co.uk/blog/2010/02/rails-3-html-escaping

यदि आप भागने आप raw

उपयोग कर सकते हैं नहीं करना चाहती
संबंधित मुद्दे