
रूबी HTML और CSS सैनिटाइज़र।
Sanitize एक allowlist-आधारित HTML और CSS सैनिटाइज़र है। यह किसी स्ट्रिंग से सभी HTML और/या CSS हटा देता है, सिवाय उन एलिमेंट्स, एट्रिब्यूट्स और प्रॉपर्टीज़ के जिन्हें आप अनुमति देना चुनते हैं।
एक सरल कॉन्फ़िगरेशन सिंटैक्स का उपयोग करके, आप Sanitize को बता सकते हैं कि कुछ HTML एलिमेंट्स, उन एलिमेंट्स के भीतर कुछ एट्रिब्यूट्स, और यहाँ तक कि URL वाले एट्रिब्यूट्स के भीतर कुछ URL प्रोटोकॉल की अनुमति दी जाए। आप CSS वाले एलिमेंट्स या एट्रिब्यूट्स में विशिष्ट CSS प्रॉपर्टीज़, @ नियम और URL प्रोटोकॉल की भी अनुमति दे सकते हैं। जिस भी HTML या CSS को आप स्पष्ट रूप से अनुमति नहीं देते, उसे हटा दिया जाएगा।
Sanitize Nokogiri HTML5 parser पर आधारित है, जो HTML को उसी तरह पार्स करता है जैसे आधुनिक ब्राउज़र करते हैं, और Crass पर, जो CSS को उसी तरह पार्स करता है जैसे आधुनिक ब्राउज़र करते हैं। जब तक आपका allowlist कॉन्फ़िग केवल सुरक्षित मार्कअप और CSS की अनुमति देता है, तब तक सबसे विकृत या दुर्भावनापूर्ण इनपुट भी सुरक्षित आउटपुट में परिवर्तित हो जाएगा।
[!WARNING]
Sanitize
<math>या<svg>एलिमेंट्स की सामग्री को पूरी तरह से सैनिटाइज़ नहीं कर सकता। MathML और SVG एलिमेंट्स foreign elements हैं जो सामान्य HTML पार्सिंग नियमों का पालन नहीं करते।डिफ़ॉल्ट रूप से, Sanitize सभी MathML और SVG एलिमेंट्स को हटा देगा। यदि आप कस्टम एलिमेंट allowlist में MathML या SVG एलिमेंट्स जोड़ते हैं, तो आप अपने एप्लिकेशन में एक सुरक्षा भेद्यता उत्पन्न कर सकते हैं।
gem install sanitize
require 'sanitize'
# Clean up an HTML fragment using Sanitize's permissive but safe Relaxed config.
# This also sanitizes any CSS in `<style>` elements or `style` attributes.
Sanitize.fragment(html, Sanitize::Config::RELAXED)
# Clean up an HTML document using the Relaxed config.
Sanitize.document(html, Sanitize::Config::RELAXED)
# Clean up a standalone CSS stylesheet using the Relaxed config.
Sanitize::CSS.stylesheet(css, Sanitize::Config::RELAXED)
# Clean up some CSS properties using the Relaxed config.
Sanitize::CSS.properties(css, Sanitize::Config::RELAXED)
Sanitize निम्नलिखित प्रकार के इनपुट को सैनिटाइज़ कर सकता है:
<style> एलिमेंट्स के अंदर CSS स्टाइलशीटstyle एट्रिब्यूट्स के अंदर CSS प्रॉपर्टीज़[!WARNING]
Sanitize
<math>या<svg>एलिमेंट्स की सामग्री को पूरी तरह से सैनिटाइज़ नहीं कर सकता। MathML और SVG एलिमेंट्स foreign elements हैं जो सामान्य HTML पार्सिंग नियमों का पालन नहीं करते।डिफ़ॉल्ट रूप से, Sanitize सभी MathML और SVG एलिमेंट्स को हटा देगा। यदि आप किसी कस्टम एलिमेंट allowlist में MathML या SVG एलिमेंट्स जोड़ते हैं, तो आप अपने एप्लिकेशन में सुरक्षा भेद्यता उत्पन्न कर सकते हैं।
फ़्रैगमेंट HTML का एक स्निपेट है जिसमें रूट-स्तरीय <html> एलिमेंट नहीं होता।
यदि आप कोई कॉन्फ़िगरेशन विकल्प निर्दिष्ट नहीं करते हैं, तो Sanitize डिफ़ॉल्ट रूप से अपनी सबसे सख्त सेटिंग्स का उपयोग करेगा, जिसका अर्थ है कि यह सभी HTML को हटा देगा और केवल सुरक्षित टेक्स्ट पीछे छोड़ेगा।
html = '<b><a href="http://foo.com/">foo</a></b><img src="https://raw.githubusercontent.com/rgrove/sanitize/main/bar.jpg">'
Sanitize.fragment(html)
# => "foo"
विशिष्ट तत्वों को रखने के लिए, उन्हें तत्व अनुमति-सूची में जोड़ें।
Sanitize.fragment(html, elements: ['b'])
# => "<b>foo</b>"
किसी दस्तावेज़ को सैनिटाइज़ करते समय, <html> एलिमेंट को allowlist में शामिल करना आवश्यक है। आप अच्छी तरह से बने दस्तावेज़ प्रकार परिभाषाओं (document type definitions) की अनुमति देने के लिए :allow_doctype को true पर भी सेट कर सकते हैं।
html = %[
<!DOCTYPE html>
<html>
<b><a href="http://foo.com/">foo</a></b><img src="https://raw.githubusercontent.com/rgrove/sanitize/main/bar.jpg">
</html>
]
Sanitize.document(html,
allow_doctype: true,
elements: ['html']
)
# => "<!DOCTYPE html><html>foo\n \n</html>"
किसी HTML फ़्रैगमेंट या दस्तावेज़ में CSS को सैनिटाइज़ करने के लिए, पहले <style> एलिमेंट और/या style एट्रिब्यूट को allowlist करें। फिर उन CSS प्रॉपर्टीज़, @ नियमों और URL प्रोटोकॉल को allowlist करें जिन्हें आप अनुमति देना चाहते हैं। आप यह भी चुन सकते हैं कि CSS टिप्पणियों या ब्राउज़र संगतता हैक्स को अनुमति दी जाए या नहीं।
html = %[
<style>
div { color: green; width: 1024px; }
</style>
<div style="height: 100px; width: 100px;"></div>
<p>hello!</p>
]
Sanitize.fragment(html,
elements: ['div', 'style'],
attributes: {'div' => ['style']},
css: {
properties: ['width']
}
)
#=> %[
# <style>
# div { width: 1024px; }
# </style>
#
# <div style=" width: 100px;"></div>
# hello!
# ]
Sanitize HTML पार्सर को लागू किए बिना एक स्टैंडअलोन CSS स्टाइलशीट या प्रॉपर्टी स्ट्रिंग को आसानी से साफ़ कर देगा।
[!WARNING] इसका उपयोग केवल स्टैंडअलोन CSS फ़ाइल में उपयोग के लिए CSS को सैनिटाइज़ करने हेतु किया जाना चाहिए। HTML संदर्भ में उपयोग के लिए CSS को सुरक्षित रूप से सैनिटाइज़ करने के लिए, जैसे कि
<style>एलिमेंट याstyleएट्रिब्यूट में, आपको पिछले अनुभागों में वर्णित अनुसार उपयुक्त allowlist के साथSanitize.document()याSanitize.fragment()का उपयोग करना होगा। ऐसा न करने पर HTML इंजेक्शन हमले सक्षम हो सकते हैं।
css = %[
@import url(evil.css);
a { text-decoration: none; }
a:hover {
left: expression(alert('xss!'));
text-decoration: underline;
}
]
Sanitize::CSS.stylesheet(css, Sanitize::Config::RELAXED)
# => %[
#
#
# a { text-decoration: none; }
#
# a:hover {
#
# text-decoration: underline;
# }
# ]
Sanitize::CSS.properties(%[
left: expression(alert('xss!'));
text-decoration: underline;
], Sanitize::Config::RELAXED)
# => %[
#
# text-decoration: underline;
# ]
अल्ट्रा-सेफ़ डिफ़ॉल्ट सेटिंग्स के अलावा, Sanitize तीन अन्य अंतर्निहित कॉन्फ़िगरेशन के साथ आता है जिन्हें आप सीधे उपयोग कर सकते हैं या अपनी आवश्यकताओं को पूरा करने के लिए अनुकूलित कर सकते हैं।
केवल बहुत सरल इनलाइन मार्कअप की अनुमति देता है। कोई लिंक, छवियाँ या ब्लॉक तत्व नहीं।
Sanitize.fragment(html, Sanitize::Config::RESTRICTED)
# => "<b>foo</b>"
फ़ॉर्मेटिंग एलिमेंट्स, लिंक और सूचियों सहित विविध मार्कअप की अनुमति देता है।
छवियों और तालिकाओं की अनुमति नहीं है, लिंक FTP, HTTP, HTTPS और mailto प्रोटोकॉल तक सीमित हैं, और SEO स्पैम को कम करने के लिए सभी लिंक में rel="nofollow" एट्रिब्यूट जोड़ा जाता है।
Sanitize.fragment(html, Sanitize::Config::BASIC)
# => '<b><a href="http://foo.com/" rel="nofollow">foo</a></b>'
यह और भी अधिक विविध प्रकार के मार्कअप की अनुमति देता है, जिसमें छवियाँ और तालिकाएँ, साथ ही सुरक्षित CSS शामिल हैं। लिंक अभी भी FTP, HTTP, HTTPS, और mailto प्रोटोकॉल तक सीमित हैं, जबकि छवियाँ HTTP और HTTPS तक सीमित हैं। इस मोड में, लिंक में rel="nofollow" नहीं जोड़ा जाता है।
Sanitize.fragment(html, Sanitize::Config::RELAXED)
# => '<b><a href="http://foo.com/">foo</a></b><img src="https://raw.githubusercontent.com/rgrove/sanitize/main/bar.jpg">'
यदि अंतर्निहित मोड आपकी आवश्यकताओं को पूरा नहीं करते हैं, तो आप आसानी से एक कस्टम कॉन्फ़िगरेशन निर्दिष्ट कर सकते हैं:
Sanitize.fragment(html,
elements: ['a', 'span'],