यह html_safe
की तरह लगता है स्ट्रिंग वर्ग के लिए एक अमूर्त क्या, चल रहा है, उदाहरण के लिए की समझ की आवश्यकता है कि,क्यों रेल 3 में, <% = note.html_safe%> और <% = ज note.html_safe%> एक ही परिणाम दे सकता है?
<%= '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
लाइन 4 के लिए, यदि हम कह रहे हैं, ठीक है, हम स्ट्रिंग पर भरोसा कहते हैं - यह सुरक्षित है, लेकिन हम इसे क्यों नहीं निकाल सकते? ऐसा नहीं है कि h
से यह बच रहा है, स्ट्रिंग असुरक्षित हो गया है।
, अगर स्ट्रिंग h
सहायता से निकले नहीं है, यह स्वचालित रूप से छोड़ दिया जाएगा। लाइन 5 पर, h
स्ट्रिंग से दो बार नहीं बच सकता - दूसरे शब्दों में, <
के बाद <
में बदल दिया गया है, यह &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
जोड़ते हैं, जो काफी खतरनाक हो सकता है, क्योंकि यह एक्सएसएस हमले को इस तरह पेश कर सकता है, इसलिए यह समझना कि यह वास्तव में कैसे काम करता है । उपर्युक्त केवल अनुमान है कि यह वास्तव में कैसे काम करता है। क्या यह वास्तव में एक अलग तंत्र हो सकता है और क्या कोई ऐसा दस्तावेज़ है जो इसका समर्थन करता है?
दिलचस्प ... यह एक नया वर्ग सेफबफर का उपयोग "ध्वज" के रूप में करता है ... इसलिए '"foobar" .html_safe' वास्तव में मूल स्ट्रिंग की सामग्री के साथ सेफबफर का एक नया उदाहरण बना देगा और वापस करेगा ... –