कच्चे बनाम HTML_safe बनाम एच को HTML अनसेस्केप करने के लिए


323

मान लीजिए कि मेरे पास निम्नलिखित स्ट्रिंग है

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

मेरे विचार में, मैं एक लिंक प्रदर्शित करना चाहता हूं। यही कारण है, मैं नहीं चाहता कि @x में सब कुछ एक स्ट्रिंग के रूप में प्रदर्शित किया जाए। उपयोग करने के बीच अंतर क्या है

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

?


चूँकि किसी ने इसका उल्लेख नहीं किया है, मुझे लगा कि मैं भी उल्लेख करूँगा <%== @x %>जो कि <%= raw(@x) %> एजगाइड्स के
CTS_AE

जवाबों:


386

रेल 3 को ध्यान में रखते हुए:

html_safeवास्तव में "स्ट्रिंग को HTML सुरक्षित" के रूप में सेट करता है (यह उससे थोड़ा अधिक जटिल है, लेकिन मूल रूप से यह है)। इस तरह, आप वसीयत में सहायकों या मॉडलों से HTML सुरक्षित तार वापस कर सकते हैं।

hएक नियंत्रक या दृश्य के भीतर से ही इस्तेमाल किया जा सकता है, क्योंकि यह एक सहायक से है। यह आउटपुट को भागने से मजबूर कर देगा। यह वास्तव में पदावनत नहीं है, लेकिन आप सबसे अधिक संभावना है कि अब इसका उपयोग नहीं करेंगे: एकमात्र उपयोग एक html_safeघोषणा को "वापस" करना है , बहुत ही असामान्य।

के साथ अपनी अभिव्यक्ति को प्रस्तुत rawकरना वास्तव में इसके to_sसाथ जंजीर बुलाने के बराबर है html_safe, लेकिन एक सहायक की तरह ही घोषित किया जाता है h, इसलिए इसका उपयोग केवल नियंत्रकों और विचारों पर किया जा सकता है।

" सेफबफर्स ​​और रेल्स 3.0 " इस बात पर एक अच्छी व्याख्या है कि SafeBufferएस (वर्ग जो html_safeजादू करता है ) कैसे काम करता है।


42
मैं यह नहीं कहूंगा कि hकभी भी पदावनत किया जाएगा। उपयोग करना "Hi<br/>#{h@ user.name}".html_safeकाफी सामान्य है और एक स्वीकृत उपयोग है।
maletor

1
@ माल्टोर दिलचस्प उपयोग, हालांकि मुझे अभी भी लगता है कि यह "असामान्य" श्रेणी में आता है।
फैबियो बतिस्ता

5
स्ट्रिंग # html_safe वास्तव में ActiveSupport का एक उदाहरण देता है :: SafeBuffer जो मूल स्ट्रिंग को लपेटता है और #html_safe है? । मूल स्ट्रिंग #html_safe नहीं बनती है? इस पर #html_safe कॉल करने के बाद।
jmaxyz

9
ध्यान दें कि व्यवहार में rawऔर बीच में एक सूक्ष्म अंतर है html_safe: raw(nil)एक खाली स्ट्रिंग लौटाता है, जबकि nil.html_safeएक अपवाद फेंकता है।
वैन डर होउन

2
hएक html_safe घोषणा को "वापस" नहीं करेगा। जब एक स्ट्रिंग है html_safe, hकुछ नहीं करेगा।
गुईजीएस

113

मुझे लगता है कि यह दोहराता है: आपके स्ट्रिंग से HTML-एस्केप नहींhtml_safe होता है । वास्तव में, यह आपके तार को बच निकलने से रोकेगा।

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

रखूंगा:

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

आपके HTML स्रोत में (yay, so safe!), जबकि:

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

चेतावनी संवाद को पॉप अप करेगा (क्या आप सुनिश्चित हैं कि आप क्या चाहते हैं?)। तो आप शायद html_safeकिसी भी उपयोगकर्ता-दर्ज स्ट्रिंग्स पर कॉल नहीं करना चाहते हैं।


81
दूसरे शब्दों में, html_safe "कृपया इस html को सुरक्षित न बनाएं", यह विपरीत है - यह आप प्रोग्रामर है जो रेल को बता रहा है कि "यह स्ट्रिंग html सुरक्षित है, वादा करें!"
पॉलमुरैब्रिज

वास्तव में मैं यह पता लगाने के लिए यहां आया था कि क्या यह वास्तव में unescape करता है या यदि यह सिर्फ एक निशान बनाता है कि यह आवश्यक नहीं है to_escape । काफी फर्क है। ओह ठीक है, स्रोत कोड तब पढ़ना।
साइमन बी।

"Html_safe" की अवधारणा स्ट्रिंग पर सिर्फ एक मेटा ध्वज है। कुछ छाप लगाई जा रही html_safeहै नहीं बच न ही unescape। जबकि HTML को सुरक्षित नहीं के रूप में कुछ चिह्नित करने का अंतिम परिणाम है , और फिर ERB <% = टैग के निहित बचने का उपयोग करते हुए, डेटा को हटाने के समान हो सकता है और फिर इसे आउटपुट पर फिर से बच सकता है, कार्यात्मक रूप से यह न तो कर रहा है। की अंतर की तरह (6 * -1 * -1), बनाम 6.
बेन Zittlau

46

अंतर रेल html_safe()और 'के बीच है raw()। इस पर येहुदा काटज़ द्वारा एक उत्कृष्ट पोस्ट है, और यह वास्तव में इस पर उबलता है:

def raw(stringish)

  stringish.to_s.html_safe

end

हाँ, raw()एक आवरण है जिसके चारों ओर html_safe()स्ट्रिंग को इनपुट मजबूर करता है और फिर उस html_safe()पर कॉल करता है। यह भी ऐसा मामला है जो raw()एक मॉड्यूल में सहायक है जबकि html_safe()स्ट्रिंग वर्ग पर एक विधि है जो एक नया ActiveSupport :: SafeBuffer उदाहरण बनाता है - जिसमें इसका एक @dirtyझंडा है।

" रेल्स html_safe बनाम रॉ " का संदर्भ लें ।


30
  1. html_safe :

    एक स्ट्रिंग को विश्वसनीय सुरक्षित के रूप में चिह्नित करता है। यह HTML में डाला जाएगा जिसमें कोई अतिरिक्त पलायन नहीं होगा।

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

    rawचारों ओर एक आवरण है html_safe। का प्रयोग करें rawअगर वहाँ संभावना है कि स्ट्रिंग होगा रहे हैं nil

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
  3. h के लिए उर्फ html_escape :

    HTML टैग वर्णों से बचने के लिए एक उपयोगिता विधि। किसी भी असुरक्षित सामग्री से बचने के लिए इस विधि का उपयोग करें।

    रेल 3 और इसके बाद के संस्करण का उपयोग डिफ़ॉल्ट रूप से किया जाता है, इसलिए आपको इस पद्धति का स्पष्ट रूप से उपयोग करने की आवश्यकता नहीं है



2

सरल रेल की शर्तों में:

h HTML टैग को संख्या वर्णों में हटा दें ताकि रेंडरिंग आपके HTML को तोड़ न दे

html_safe स्ट्रिंग में एक बूलियन सेट करता है ताकि स्ट्रिंग को html सेव माना जाए

raw यह html_safe को स्ट्रिंग में कनवर्ट करता है


hहै html_safeजिसका मतलब है के रूप में है एचटीएमएल प्रदान की गई है,।
डेव न्यूटन

उत्तर सही है: h html_escape है ... रेल कोड आधार से
नोटपैड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.