HTML एक स्ट्रिंग को कैसे एन्कोड / एस्केप करता है? क्या कोई बिल्ट-इन है?


98

मेरे पास एक अविश्वसनीय स्ट्रिंग है जिसे मैं एक HTML पृष्ठ में पाठ के रूप में दिखाना चाहता हूं। मुझे HTML संस्थाओं के रूप में ' <' और ' &' वर्ण से बचने की आवश्यकता है । कम उपद्रव बेहतर है।

मैं UTF8 का उपयोग कर रहा हूं और उच्चारण पत्रों के लिए अन्य संस्थाओं की आवश्यकता नहीं है।

क्या रूबी या रेल में एक अंतर्निहित फ़ंक्शन है, या मुझे अपना रोल करना चाहिए?


2
OWASP के अनुसार , निम्नलिखित छह वर्णों को HTML तत्व सामग्री में उचित XSS सुरक्षा के लिए बचना चाहिए:&<>"'/
sffc

जवाबों:


94

hसहायक विधि:

<%=h "<p> will be preserved" %>

खैर, यह भी बच जाता है>, जो अनावश्यक है, लेकिन यह करेंगे।
kch

आप कुछ के बिना और कुछ के साथ मुद्रित करने के लिए कोष्ठक का उपयोग कर सकते हैं। <% = h ("<p") + ">"%>
ट्रेवर ब्रम्बल

अब वह मूर्खतापूर्ण होगा। मुझे बहुत परवाह नहीं है अगर यह बच जाता है या नहीं। मैं सिर्फ यह नोट कर रहा हूं कि यह html स्पेक्स के हिसाब से जरूरी नहीं है।
kch

12
यह है कभी कभी एक्सएमएल कल्पना की नहीं बल्कि कष्टप्रद आग्रह है कि ']]>' बाहर पाठ का ( 'CharData' उत्पादन देखें) रखा जाना के कारण XHTML में की आवश्यकता है। यह इसे आम तौर पर आसान (और हानिरहित) बना देता है ताकि वह हमेशा बच सके।
बोबिन्स

19
रुचि रखने वालों के लिए hएक उपनाम हैhtml_escape
lightswitch05

141

रूबी सीजीआई वर्ग की जाँच करें। HTML के साथ-साथ URL को एनकोड और डीकोड करने की विधियाँ हैं।

CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;"

12
धन्यवाद, यह बहुत अच्छा है क्योंकि यह नियंत्रकों से किया जा सकता है। ऐसा नहीं है कि मैं ऐसा करूँगा, बिल्कुल।
दान रोसेनस्टार्क

2
यह टेम्प्लेट में डाली गई सामग्री की शुद्धता (जब एचटीएमएल-बची हुई सामग्री को माना जाता है) की शुद्धता की जाँच करने में उपयोगी है।
एलेक्स डी।

यदि सामग्री को क्लाइंट वेबसाइट में प्रदर्शित किया जा रहा है, तो अन्य अपना (जहां आप दृश्य को नियंत्रित नहीं कर सकते हैं), डेटाबेस में डालने से पहले html से बचने में क्या समस्या है? क्या कोई और काम है?
n00b

सही - डेटाबेस में प्रवेश करने से पहले बचना बहुत अच्छा है। आप केवल यह सुनिश्चित करना चाहते हैं कि आपके पास इसे जोड़ने से पहले कोई पुरानी अन-एस्केप हैक नहीं है ...
केविन

5
मुझे इसका पर्यायवाची अधिक पसंद है: CGI.escape_html
लियू

77

रूबी ऑन रेल्स 3 में डिफ़ॉल्ट रूप से HTML बच जाएगा।

गैर-बच गए तार के उपयोग के लिए:

<%= raw "<p>hello world!</p>" %>

25

ERB :: Util.html_escape का उपयोग कहीं भी किया जा सकता है। यह requireरेल में उपयोग किए बिना उपलब्ध है ।


यह वास्तव में CGI.escapeHTMLनीचे का उपयोग कर रहा है
akostadinov

@akostadinov - परिणाम हालांकि अलग है। उदाहरण के लिए, ERB :: Util.html_escape एपोस्ट्रोफ़ को & # x27 में बदल देगा; जबकि CGI :: भागने एचटीएमएल नहीं होगा
लुई सायर्स

@LouisSayers, मैं यह नहीं देख सकता कि ऐसा कैसे हो सकता है: `` [43] pry (मुख्य)> शो-स्रोत ERB :: Util.html_escape से: /usr/share/ruby/erb.rb @ लाइन 945: स्वामी : # <वर्ग: ERB :: Util> दृश्यता: सार्वजनिक लाइनों की संख्या: 3 def html_escape (s) CGI.escapeHTML (s.to_s) अंत ``
akostadinov

@akostadinov - हम्म ... बस फिर से दौड़ा और हाँ, उन्होंने एक ही आउटपुट का उत्पादन किया। जब मैंने इसे काम पर चलाया (तो शायद अलग erb / cgi संस्करण व्यवहार?) मैंने इसे अलग-अलग परिणाम दिए। मुझे यह देखना होगा कि मुझे कल काम पर एक अलग परिणाम क्यों मिला।
लुईस सैयर्स

17

कहीं भी बचने वाले HTML का उपयोग करने के लिए क्रिस्टोफर ब्रैडफोर्ड के जवाब के अलावा, क्योंकि ज्यादातर लोग CGIआजकल उपयोग नहीं करते हैं, आप भी उपयोग कर सकते हैं Rack:

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')

क्या मॉडल उदाहरण विधियों में समान तरीके से तार से बचने का एक बेहतर तरीका है?
सक्रिय

15

आप h()या तो उपयोग कर सकते हैं html_escape(), लेकिन अधिकांश लोग h()सम्मेलन द्वारा उपयोग करते हैं । रेल के h()लिए कम है html_escape()

आपके नियंत्रक में:

@stuff = "<b>Hello World!</b>"

आपके विचार में:

<%=h @stuff %>

यदि आप HTML स्रोत देखते हैं: तो आप वास्तव में डेटा को खोले बिना आउटपुट देखेंगे। यानी यह इनकोडेड है &lt;b&gt;Hello World!&lt;/b&gt;

यह प्रदर्शित होने के रूप में दिखाई देगा <b>Hello World!</b>


9

विभिन्न तरीकों की तुलना:

> CGI::escapeHTML("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote &#x27; double quotes &quot;"

> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

मैंने लिखा है कि मेरा खुद का रेलिंग एक्टिवमेलर से बचना संगत है:

def escape_html(str)
  CGI.escapeHTML(str).gsub("&#39;", "'")
end

0

h() उद्धरणों से बचने के लिए भी उपयोगी है।

उदाहरण के लिए, मेरे पास एक दृश्य है जो एक पाठ क्षेत्र का उपयोग करके लिंक उत्पन्न करता है result[r].thtitle। पाठ में एकल उद्धरण शामिल हो सकते हैं। अगर मैं result[r].thtitleपुष्टिकरण विधि से बच नहीं पाया , तो जावास्क्रिप्ट टूट जाएगा:

&lt;%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource,
:action         =>:delete_resourced,
:id     => result[r].id,
:th     => thread,                                                                                                      
:html       =>{:title=> "<= Remove"},                                                       
:confirm    => h("#{result[r].thtitle} will be removed"),                                                   
:method     => :delete %>

&lt;a href="#" onclick="if (confirm('docs: add column &amp;apos;dummy&amp;apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&amp;th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="&lt;= Remove">docs: add column 'dummy'</a>

नोट: :htmlशीर्षक घोषणा जादुई रूप से रेल द्वारा बच गई है।

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