
bluemonday: एक तेज़ golang HTML sanitizer (OWASP Java HTML Sanitizer से प्रेरित) जो उपयोगकर्ता द्वारा उत्पन्न सामग्री को XSS से साफ़ करता है
bluemonday Go में कार्यान्वित एक HTML सैनिटाइज़र है। यह तेज़ और अत्यधिक कॉन्फ़िगरेबल है।
bluemonday अविश्वसनीय उपयोगकर्ता द्वारा उत्पन्न सामग्री को इनपुट के रूप में लेता है, और अनुमोदित HTML तत्वों और विशेषताओं की एक अनुमति सूची के विरुद्ध स्वच्छ किए गए HTML को लौटाता है ताकि आप सुरक्षित रूप से अपने वेब पेज में सामग्री शामिल कर सकें।
यदि आप उपयोगकर्ता द्वारा उत्पन्न सामग्री स्वीकार करते हैं, और आपका सर्वर Go का उपयोग करता है, तो आपको bluemonday की आवश्यकता है।
उपयोगकर्ता द्वारा उत्पन्न सामग्री के लिए डिफ़ॉल्ट नीति (bluemonday.UGCPolicy().Sanitize()) इसे बदल देती है:
Hello <STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>World
एक हानिरहित में:
Hello World
और यह इसे बदल देता है:
<a href="javascript:alert('XSS1')" onmouseover="alert('XSS2')">XSS<a>
इसमें:
XSS
जबकि अभी भी इसकी अनुमति देता है:
<a href="http://www.google.com/">
<img src="https://ssl.gstatic.com/accounts/ui/logo_2x.png"/>
</a>
ज्यादातर अपरिवर्तित गुज़रने के लिए (इसे एक rel="nofollow" मिला जो उपयोगकर्ता द्वारा उत्पन्न सामग्री के लिए एक अच्छी बात है):
<a href="http://www.google.com/" rel="nofollow">
<img src="https://ssl.gstatic.com/accounts/ui/logo_2x.png"/>
</a>
यह साइटों को XSS हमलों से बचाता है। XSS हमले के लिए कई वैक्टर हैं और जोखिम को कम करने का सबसे अच्छा तरीका उपयोगकर्ता इनपुट को HTML तत्वों और विशेषताओं की ज्ञात सुरक्षित सूची के विरुद्ध स्वच्छ करना है।
आपको हमेशा किसी अन्य प्रसंस्करण के बाद bluemonday चलाना चाहिए।
यदि आप blackfriday या Pandoc का उपयोग करते हैं तो bluemonday को इन चरणों के बाद चलाया जाना चाहिए। यह सुनिश्चित करता है कि आपकी प्रक्रिया में बाद में कोई असुरक्षित HTML शामिल नहीं किया गया है।
bluemonday OWASP Java HTML Sanitizer और HTML Purifier दोनों से काफी प्रेरित है।
अनुमति सूची पर आधारित, आपको या तो अनुमति देने के लिए HTML तत्वों और विशेषताओं (और विशेषताओं के regexp पैटर्न) का वर्णन करने वाली एक नीति बनाने की आवश्यकता है, या अच्छे डिफ़ॉल्ट का प्रतिनिधित्व करने वाली प्रदान की गई नीतियों में से एक का उपयोग करें।
अनुमति सूची वाली नीति को मुख्य Go टीम द्वारा Go net/html लाइब्रेरी में कार्यान्वित एक तेज़ गैर-मान्यकरण, केवल आगे-बढ़ने वाले, टोकन-आधारित पार्सर का उपयोग करके लागू किया जाता है।
हम उम्मीद करते हैं कि हमें अच्छी तरह से स्वरूपित HTML (प्रत्येक लागू खुले तत्व के लिए बंद करने वाले तत्व, सही ढंग से नेस्टेड) प्रदान किया जाएगा और इसलिए हम खराब नेस्टेड या अपूर्ण HTML की मरम्मत पर ध्यान केंद्रित नहीं करते हैं। हम केवल यह सुनिश्चित करने पर ध्यान केंद्रित करते हैं कि जो भी तत्व मौजूद हैं वे नीति अनुमति सूची में वर्णित हैं और विशेषताएँ और लिंक आपके वेब पेज पर उपयोग के लिए सुरक्षित हैं। GIGO लागू होता है और यदि आप इसे खराब HTML खिलाते हैं तो bluemonday इसे फिर से अच्छा बनाने के तरीके का पता लगाने का काम नहीं करता है।
हाँ
हम व्यापक रूप से उपयोग किए जाने वाले और भारी क्षेत्र-परीक्षण किए गए OWASP Java HTML Sanitizer से स्थानांतरित होकर उत्पादन में bluemonday का उपयोग कर रहे हैं।
हम अपने व्यापक परीक्षण सूट (AntiSamy परीक्षणों के साथ-साथ उठाए गए किसी भी मुद्दे के परीक्षण सहित) को पास कर रहे हैं। किसी भी अनसुलझे मुद्दे की जाँच करें कि क्या आपके लिए कुछ बाधा हो सकती है।
हम पुल रिक्वेस्ट और मुद्दों को आमंत्रित करते हैं ताकि हमें यह सुनिश्चित करने में मदद मिल सके कि हम उपयोगकर्ता द्वारा उत्पन्न सामग्री के माध्यम से विभिन्न हमलों के खिलाफ व्यापक सुरक्षा प्रदान कर रहे हैं।
go get github.com/microcosm-cc/bluemonday का उपयोग करके इंस्टॉल करें
फिर इसे कॉल करें:
package main
import (
"fmt"
"github.com/microcosm-cc/bluemonday"
)
func main() {
// Do this once for each unique policy, and use the policy for the life of the program
// Policy creation/editing is not safe to use in multiple goroutines
p := bluemonday.UGCPolicy()
// The policy can then be used to sanitize lots of input and it is safe to use the policy in multiple goroutines
html := p.Sanitize(
`<a onblur="alert(secret)" href="http://www.google.com">Google</a>`,
)
// Output:
// <a href="http://www.google.com" rel="nofollow">Google</a>
fmt.Println(html)
}
हम Sanitize को कॉल करने के तीन तरीके प्रदान करते हैं:
p.Sanitize(string) string
p.SanitizeBytes([]byte) []byte
p.SanitizeReader(io.Reader) bytes.Buffer
यदि आप प्रदर्शन के बारे में जुनूनी हैं, तो p.SanitizeReader(r).Bytes() इनपुट या आउटपुट के किसी भी अनावश्यक कास्टिंग के बिना एक []byte लौटाएगा। हालांकि अंतर इतना नगण्य है कि आपको कभी चिंता करने की आवश्यकता नहीं है।
आप अपनी स्वयं की नीतियां बना सकते हैं:
package main
import (
"fmt"
"github.com/microcosm-cc/bluemonday"
)
func main() {
p := bluemonday.NewPolicy()
// Require URLs to be parseable by net/url.Parse and either:
// mailto: http:// or https://
p.AllowStandardURLs()
// We only allow <p> and <a href="">
p.AllowAttrs("href").OnElements("a")
p.AllowElements("p")
html := p.Sanitize(
`<a onblur="alert(secret)" href="http://www.google.com">Google</a>`,
)
// Output:
// <a href="http://www.google.com">Google</a>
fmt.Println(html)
}
हम दो डिफ़ॉल्ट नीतियां भेजते हैं:
bluemonday.StrictPolicy() जिसे सभी HTML तत्वों और उनकी विशेषताओं को हटाने के समतुल्य माना जा सकता है क्योंकि इसकी अनुमति सूची में कुछ भी नहीं है। उपयोग का एक उदाहरण परिदृश्य ब्लॉग पोस्ट शीर्षक होंगे जहां HTML टैग की बिल्कुल भी उम्मीद नहीं की जाती है और यदि वे हैं तो तत्वों और तत्वों की सामग्री को हटा दिया जाना चाहिए। यह एक बहुत सख्त नीति है।
bluemonday.UGCPolicy() जो उपयोगकर्ता द्वारा उत्पन्न सामग्री के लिए सुरक्षित HTML तत्वों और विशेषताओं का एक व्यापक चयन की अनुमति देता है। ध्यान दें कि यह नीति iframes, object, embed, styles, script, आदि की अनुमति नहीं देती है। उपयोग का एक उदाहरण परिदृश्य ब्लॉग पोस्ट बॉडी होंगे जहां विभिन्न प्रकार के फ़ॉर्मेटिंग की अपेक्षा की जाती है और TABLEs और IMGs की संभावना भी होती है।
नीति बनाने का सार यह निर्धारित करना है कि आपके परिदृश्य के लिए कौन से HTML तत्व और विशेषताएं सुरक्षित मानी जाती हैं। OWASP जोखिमों को समझाने में मदद करने के लिए एक XSS रोकथाम चीट शीट प्रदान करता है, लेकिन मूल रूप से:
script, style, iframe, object, embed, base तत्वों से बचें जो क्लाइंट द्वारा कोड निष्पादित करने या तीसरे पक्ष की सामग्री शामिल करने की अनुमति देते हैं जो कोड निष्पादित कर सकती हैमूल रूप से, आपको यह वर्णन करने में सक्षम होना चाहिए कि आपके परिदृश्य के लिए कौन सा HTML ठीक है। यदि आपको विश्वास नहीं है कि आप अपनी नीति का वर्णन कर सकते हैं तो कृपया bluemonday.UGCPolicy() जैसी शिप की गई नीतियों में से एक का उपयोग करने पर विचार करें।
एक नई नीति बनाने के लिए:
p := bluemonday.NewPolicy()
To add elements to a policy either add just the elements:
p.AllowElements("b", "strong")
Or using a regex:
नोट: यदि कोई तत्व ऊपर दिखाए अनुसार नाम से जोड़ा जाता है, तो कोई भी मैच करने वाला regex अनदेखा कर दिया जाएगा
यह भी अनुशंसा की जाती है कि सुनिश्चित करें कि कई पैटर्न ओवरलैप न हों क्योंकि निष्पादन के क्रम की गारंटी नहीं है और इसके परिणामस्वरूप कुछ नियम छूट सकते हैं।
p.AllowElementsMatching(regex.MustCompile(`^my-element-`))