ruby on rails कच्चे बनाम html_safe बनाम एच unescape एचटीएमएल




ruby-on-rails erb (5)

सबसे अच्छा सुरक्षित तरीका है: <%= sanitize @x %>

यह एक्सएसएस से बच जाएगा!

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

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

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

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

?


  1. html_safe :

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

    "<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 उपयोग करें।

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
    
  3. html_escape लिए h उपनाम:

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

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


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

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

रखूंगा:

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

अपने एचटीएमएल स्रोत में (याय, इतना सुरक्षित!), जबकि:

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

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


सरल रेल शब्दों में:

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

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

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


अंतर रेल के 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 बनाम कच्चे का संदर्भ लें "।





erb