2009-03-30 14 views
24

रेल ऐप्स में XSS भेद्यता को रोकने के लिए HTML से बचने का अनुशंसित तरीका क्या है?रेल में HTML से बचने

क्या आपको उपयोगकर्ता को डेटाबेस में कोई टेक्स्ट डालने की अनुमति देनी चाहिए, लेकिन इसे प्रदर्शित करते समय इसे से बचें? क्या आपको इनपुट से बचने के लिए पहले सेव फिल्टर जोड़ना चाहिए?

उत्तर

22

इस समस्या के तीन मूलभूत दृष्टिकोण हैं।

  1. अपने विचारों में h() का उपयोग करें। यहां नकारात्मकता यह है कि यदि आप भूल जाते हैं, तो आपको प्वेंड मिल जाता है।
  2. एक प्लगइन का उपयोग करें जो सहेजे जाने पर सामग्री से बच निकलता है। मेरी प्लगइन xss_terminate यह करता है। फिर आपको अपने विचारों (ज्यादातर) में h() का उपयोग करने की आवश्यकता नहीं है। ऐसे कुछ भी हैं जो नियंत्रक स्तर पर काम करते हैं। यहां डाउनसाइड्स हैं (ए) यदि एस्केपिंग कोड में कोई बग है, तो आप अपने डेटाबेस में एक्सएसएस प्राप्त कर सकते हैं; और (बी) कोने के मामले हैं जहां आप अभी भी h() का उपयोग करना चाहते हैं।
  3. एक प्लगइन का उपयोग करें जो प्रदर्शित होने पर सामग्री से बच निकलता है। CrossSiteSniper शायद इनके बारे में सबसे अच्छी तरह से जाना जाता है। यह आपके गुणों को उपनाम देता है ताकि जब आप foo.name को कॉल करते हैं तो यह सामग्री से बच निकलता है। अगर आपको अनचाहे सामग्री की आवश्यकता है तो इसके चारों ओर एक रास्ता है। मुझे यह प्लगइन पसंद है लेकिन मैं एक्सएसएस को अपने डेटाबेस में पहली जगह में देने के बारे में जंगली नहीं हूं ...

फिर कुछ हाइब्रिड दृष्टिकोण हैं।

कोई कारण नहीं है कि आप एक ही समय में xss_terminate और CrossSiteSniper का उपयोग नहीं कर सकते हैं।

Erubis नामक एक ईआरबी कार्यान्वयन भी है जिसे कॉन्फ़िगर किया जा सकता है ताकि <%= foo.name %> जैसे किसी भी कॉल से बच निकला - <%= h(foo.name) %> के बराबर। दुर्भाग्य से, एरबिस हमेशा रेल के पीछे पीछे हटते हैं और इसलिए इसका उपयोग करके आप धीमा हो सकते हैं।

यदि आप और पढ़ना चाहते हैं, तो मैंने using xss_terminate के बारे में एक ब्लॉग पोस्ट लिखा है (जिसे Xavor कृपया लिंक किया गया है)।

+0

आपकी प्लगइन बहुत बढ़िया काम करती है। धन्यवाद! – djburdick

+0

रेल 3 के लिए इसे अपडेट करना चाहते हैं? – slhck

+1

यक। आपके डेटाबेस में बच निकला डेटा सैनिटी के लिए एक बुरा विचार है। – Ashe

5

अपने दृश्य टेम्पलेट में एच विधि का उपयोग करें। आप एक टिप्पणी संपत्ति के साथ एक पोस्ट वस्तु है कहते हैं:

<div class="comment"> 
    <%= h post.comment %> 
</div> 
13

html_escape के लिए एक उपनाम है, जो है सभी HTML टैग वर्णों से बचने के लिए एक उपयोगिता विधि:

html_escape('<script src=http://ha.ckers.org/xss.js></script>') 
# => &lt;script src=http://ha.ckers.org/xss.js&gt;&lt;/script&gt; 

यदि आपको अधिक नियंत्रण की आवश्यकता है, तो साथ जाएं sanitize विधि है, जिसमें टैग की एक सफेद सूची के रूप में इस्तेमाल किया जा सकता और विशेषताएँ अनुमति देने के लिए:

sanitize(@article.body, :tags => %w(table tr td), :attributes => %w(id class style)) 

मैं इनपुट कुछ भी करने के लिए उपयोगकर्ता की अनुमति होगी, डेटाबेस में के रूप में है यह स्टोर, और भागने जब यह प्रदर्शित । इस तरह आप दर्ज की गई कोई भी जानकारी खोना नहीं चाहते हैं। आप हमेशा बाद में भागने वाले तर्क को ट्विक कर सकते हैं ...

+0

मैं उपयोगकर्ताओं को कुछ भी इनपुट करने और केवल डिस्प्ले में भागने की गति को गति देता हूं। xss_terminate अच्छा है लेकिन धीमा हो सकता है और रेल 3 को अपग्रेड कर देता है जो बहुत कठिन है। – simianarmy

0

मैं सिर्फ एक प्लगइन Sanitize मणि का उपयोग कर ActsAsSanitiled कहा जाता है जो अच्छे प्रकार से निर्मित के साथ-साथ, एचटीएमएल की तरह अनुमति दी है क्या करने के लिए बहुत विन्यास किया जा रहा है गारंटी ले सकते हैं सभी उपयोगकर्ता इनपुट munging या कुछ भी आवश्यकता होती है टेम्पलेट पर याद किया जाना बिना जारी किया है स्तर।

संबंधित मुद्दे