Firefox 148 में setHTML के आने से XSS सुरक्षा और मजबूत
(hacks.mozilla.org)- वेब की प्रमुख कमजोरी XSS हमलों को रोकने के लिए Firefox ने पहली बार मानकीकृत Sanitizer API को सपोर्ट किया है
- मौजूदा innerHTML की जगह setHTML() मेथड का उपयोग करने पर, अविश्वसनीय HTML को DOM में डालने से पहले अपने-आप sanitize किया जाता है और malicious script हट जाते हैं
- अगर डिफ़ॉल्ट सेटिंग बहुत सख्त या बहुत ढीली लगे, तो डेवलपर custom settings के जरिए अनुमति देने वाले elements और attributes को नियंत्रित कर सकते हैं
- Firefox की यह सुविधा Trusted Types के साथ मिलकर पूरे वेब की सुरक्षा को बेहतर बनाती है और डेवलपर को अलग security team के बिना भी XSS रोकने में मदद करती है
XSS कमजोरी और Firefox की प्रतिक्रिया
- Cross-site scripting (XSS) तब होता है जब attacker, user input वाले content के जरिए मनमाना HTML या JavaScript inject कर देता है
- attacker इसका उपयोग user interaction की निगरानी करने या data चुराने के लिए कर सकता है
- XSS को लगभग 10 वर्षों से शीर्ष 3 वेब कमजोरियों (CWE-79) में गिना जाता रहा है
- Firefox 2009 से Content-Security-Policy (CSP) मानक को आगे बढ़ाते हुए XSS बचाव को मजबूत करता रहा है
- CSP उन resources को सीमित करता है जिन्हें वेबसाइट load और execute कर सकती है
- लेकिन इसमें मौजूदा साइट संरचना में बदलाव और लगातार security review की ज़रूरत होती है, इसलिए व्यापक अपनाने में सीमाएँ रही हैं
Sanitizer API और setHTML() की भूमिका
- Sanitizer API malicious HTML को harmless रूप में बदलने का मानकीकृत तरीका देता है
- उदाहरण कोड में `` element हटा दिया जाता है और केवल `Hello my name is
` बचता है
- setHTML() मेथड HTML insert करते समय अपने-आप sanitize प्रक्रिया चलाता है, जिससे डिफ़ॉल्ट रूप से सुरक्षित व्यवहार सुनिश्चित होता है
- मौजूदा
innerHTMLassignment को सिर्फsetHTML()से बदल देने भर से मजबूत XSS सुरक्षा मिल सकती है
- मौजूदा
- अगर डिफ़ॉल्ट सेटिंग बहुत सख्त या बहुत ढीली हो, तो डेवलपर custom settings के जरिए अनुमति वाले HTML elements और attributes को परिभाषित कर सकते हैं
- प्रयोग के लिए Sanitizer API playground टूल का उपयोग किया जा सकता है
Trusted Types के साथ संयोजन
- Trusted Types API HTML parsing और insertion को केंद्रीकृत तरीके से नियंत्रित करके अतिरिक्त security layer देता है
setHTML()का उपयोग करते समय Trusted Types policy आसानी से लागू की जा सकती है- सख्त policy केवल
setHTML()को अनुमति देकर अन्य जोखिमभरे insertion तरीकों को रोक सकती है, जिससे भविष्य में XSS regression रोकने में मदद मिलती है
Firefox 148 के सुरक्षा सुधार का प्रभाव
- Firefox 148 Sanitizer API और Trusted Types दोनों को सपोर्ट करता है, जिससे डिफ़ॉल्ट सुरक्षा स्तर में बड़ा सुधार होता है
- डेवलपर जटिल security policy या अलग security team के बिना भी सिर्फ सरल code changes से XSS रोक सकते हैं
- इस मानक के आने से सभी browsers में सुरक्षित वेब वातावरण के प्रसार की उम्मीद है
सारांश
- Firefox 148, setHTML() मेथड और Sanitizer API के जरिए वेब डेवलपर को आसानी से XSS हमले रोकने में सक्षम बनाता है
- यह सुविधा CSP की सीमाओं को पूरा करती है और डिफ़ॉल्ट रूप से सुरक्षित HTML insertion को वेब मानक के रूप में स्थापित करने का अवसर देती है
- Trusted Types के साथ मिलकर यह लंबे समय तक security बनाए रखने और XSS regression रोकने में मदद करती है
- नतीजतन, Firefox security को default मानने वाले वेब वातावरण की ओर बदलाव का नेतृत्व कर रहा है
2 टिप्पणियां
ओह, निश्चित रूप से ऐसी चीज़ की ज़रूरत तो है। अगर यह सभी browsers में support हो जाए तो बहुत बढ़िया होगा
Hacker News की राय
इस तरह की सुविधाएँ हमेशा थोड़ी चिंताजनक लगती हैं क्योंकि ऐसे methods का मिश्रण होता है जो user input को मनमाने रूप से देने पर भी सुरक्षित तरीके से handle करते हैं, और ऐसे भी जो नहीं करते; लेकिन सिर्फ नाम देखकर उनमें फर्क समझना मुश्किल होता है आदर्श रूप से, शुरू से ही खतरनाक functions का नाम ऐसा होना चाहिए जिससे जोखिम साफ़ दिखाई दे और HTML को “sanitize” करने का विचार भी अपने-आप में अस्पष्ट है, इसलिए यह तय करना कठिन है कि यह वास्तव में सुरक्षित है या नहीं
elementNode.textContentअविश्वसनीय input के लिए भी सुरक्षित है, जबकिelementNode.innerHTMLनहीं है पहला सभी characters को escape करता है, जबकि दूसरा कुछ भी escape नहीं करता कुछ लोगों का मानना है कि “HTML sanitization” मूल रूप से ऐसा problem है जिसे पूरी तरह हल नहीं किया जा सकता संबंधित चर्चा के लिए यह टिप्पणी देखें ऐसा API proposal stage से आगे बढ़ना ही नहीं चाहिए थाinnerHTMLऔरsetHTMLको मिलाकर इस्तेमाल करने के बजाय,innerHTMLको पूरी तरह हटाकर पुराने behavior की ज़रूरत होने परsetHTMLUnsafeइस्तेमाल करने जैसा design होना चाहिएinnerHTMLजैसे पुराने API को disable कर पाते हालाँकि ऐसा करने पर पुराने browsers में site चलना बंद भी कर सकती हैContent-Security-Policy: require-trusted-types-for 'script'header के साथ serve किया जाए, तो sanitizer के बिना वाले methods में सामान्य strings पास करने से रोका जा सकता हैअगर example की तरह user name में
या ` ` जैसे tags डाले जा सकते हैं, तो भले ही script execution रुक जाए, फिर भी **मनमाना markup injection** संभव रहता हैtag से CSS भी बदली जा सकती है, इसलिए उदाहरण के लिए PayPal profile page का design बदला जा सकता है तब सवाल उठता है कि ऐसा कौन चाहेगाinnerHTMLनहीं बल्किinnerTextयाtextContentइस्तेमाल होना चाहिए थाsetHTMLका उद्देश्यinnerHTMLका replacement होना हैsetHTML()की default setting बहुत सख्त या बहुत ढीली हो, तो developer एक custom setting दे सकता है जिसमें allowed HTML elements और attributes खुद define किए जाएँ", new Sanitizer({})) ``` ऐसा करने पर सभी elements हटा दिए जाएँगे आखिरकार backend में भी user name को standard तरीके से sanitize करना होगा, और output के समय HTML escape लागू करना होगा RFC 2119 के अनुसार यह “SHOULD” स्तर की requirement है
यह feature आया, यह अच्छी बात है, लेकिन browser support पर्याप्त रूप से फैलने में समय लगेगा support status Can I use पर देखा जा सकता है
शीर्षक थोड़ा सनसनीखेज़ था दरअसल
innerHTMLमें देने से पहले input जाँचने वाला function बनाकर भी sanitization लागू किया जा सकता है लेकिन ऐसे प्रयास आख़िरकार फिर से पहिया बनाने जैसे लगते हैं और पुराने Firefox में hacks.mozilla.org खुलता ही नहीं, जबकि Pale Moon या SeaMonkey में MDN टूटा हुआ दिखता है मानो कोई “browser cartel” web को बर्बाद करना चाहता होSanitizer API का गलत इस्तेमाल इसे footgun बना सकता है खास तौर पर “remove” mode का उपयोग करते समय सावधानी चाहिए मुझे तो लगता है कि सिर्फ
setTextइस्तेमाल करना और user को HTML जोड़ने की अनुमति ही न देना बेहतर हैsetHTMLइस्तेमाल करने पर भी XSS नहीं होगाinnerHTMLके आम उपयोग को देखते हुए, इसे पूरी तरह बाहर करना आसान नहीं हैयह प्रभावशाली है कि network access के हर पहलू को ठीक से नियंत्रित किया गया है, और अब security chain code पर trust से host configuration पर trust की ओर खिसक गई है defaults भी सुरक्षित रखे गए हैं
मैं वास्तव में जिस चीज़ की चाहत रखता हूँ, वह है खतरनाक code को सुरक्षित तरीके से चलाने वाला `` element मतलब खतरनाक code को बदलना नहीं, बल्कि उसे isolated environment में चलाने देना iframe की सीमा यह है कि वह DOM के साथ स्वाभाविक रूप से flow नहीं कर पाता, और AI व dynamic content के बढ़ते दौर में composable encapsulation की ज़रूरत है
setHTMLUnsafeनाम मुझे सच में बहुत पसंद आया security features तब विफल हो जाते हैं जब उन्हें developer के opt-in पर छोड़ दिया जाए इसके बजाय “खतरनाक रास्ता सचमुच खतरनाक महसूस हो” ऐसा बनाना ज़्यादा प्रभावी हैset_html()नामinner_htmlकी तुलना में कहीं ज़्यादा सहज लगता है JavaScript के APIs सचमुच बहुत बेतरतीब हैं और कभी न कभी इन्हें व्यवस्थित किया जाना चाहिए यह चर्चा भले security-केंद्रित हो, लेकिन नया API जारी करते समय design भी साफ़-सुथरा होना चाहिए90 के दशक के developers:
2020 के दशक के developers: