- Cross-Site Request पर सोचते समय शुरुआत में यह समझना मुश्किल था कि CSRF सुरक्षा और CORS दोनों की ज़रूरत क्यों पड़ती है. लेकिन इसे समझाने के लिए काफ़ी शब्दों की ज़रूरत है
CSRF और CORS
- CSRF (Cross-Site Request Forgery)
- पहले यह आम था, लेकिन अब ज़्यादातर web frameworks डिफ़ॉल्ट रूप से सुरक्षा देते हैं, इसलिए यह लगभग समस्या नहीं रह गई है
- हमले का तरीका: उपयोगकर्ता को किसी malicious site पर किसी खास form पर क्लिक कराने के लिए उकसाया जाता है ताकि वह cross-site request भेज दे
- बचाव का तरीका: यह जाँचना कि request किसी दूसरी site से आई है या नहीं
- CORS (Cross-Origin Resource Sharing)
- यह HTTP spec का हिस्सा है, जो कुछ खास cross-site requests को अनुमति देने का तरीका परिभाषित करता है
- preflight request और response headers का उपयोग करके यह तय किया जाता है कि किन origins से request भेजी जा सकती है
तो क्या cross-site requests डिफ़ॉल्ट रूप से अनुमति प्राप्त होती हैं और इसलिए CSRF सुरक्षा चाहिए, या वे डिफ़ॉल्ट रूप से block होती हैं और इसलिए CORS की ज़रूरत पड़ती है? सही जवाब है दोनों.
डिफ़ॉल्ट व्यवहार
- Same-origin policy
- यह browser द्वारा लागू की जाने वाली security policy है
- आम तौर पर cross-site write की अनुमति होती है, लेकिन read पर रोक होती है
- उदाहरण के लिए, browser form के ज़रिए POST request की अनुमति देता है, लेकिन response को पढ़ने नहीं देता
- SameSite cookie policy
- 2019 में cookies के डिफ़ॉल्ट व्यवहार में बदलाव किया गया
- पहले cross-site requests में भी cookies हमेशा भेजी जाती थीं
- नया
SameSiteattribute जोड़ा गया और डिफ़ॉल्ट मानLaxकर दिया गया - 2025 तक, 96% browsers
SameSiteattribute को support करते हैं, और 75% नया default (Lax) support करते हैं - लेकिन Safari ने इसे default के रूप में लागू नहीं किया, और UCBrowser अभी भी इसे support नहीं करता
- Site और Origin का अंतर
- Origin:
protocol + hostname + portका संयोजन - Site:
protocol + top-level domain + 1का संयोजन (subdomain और port को नज़रअंदाज़ किया जाता है)
- Origin:
CORS
- CORS, same-origin policy में कुछ खास origins के लिए अपवादस्वरूप अनुमति देने का तरीका है
- browser request भेजने से पहले
OPTIONStype की preflight request भेजता है - server response headers के ज़रिए अनुमति नियम तय करता है (
Access-Control-*headers का उपयोग) - जिन request types पर CORS लागू होता है:
fetchऔरXMLHttpRequest- web fonts
- WebGL textures
canvasमेंdrawImageसे बनाई गई images/video frames- CSS
shape-outsideproperty में इस्तेमाल होने वाली images
- लेकिन form submission पर अपवादस्वरूप CORS लागू नहीं होता
- HTML 4.0 का
<form>tag बहुत पहले से cross-site requests की अनुमति देता आया है - इसलिए पुराने servers को पहले से ही CSRF attacks के ख़िलाफ़ डिज़ाइन किया गया होना चाहिए था
- response share करने के लिए server को
Access-Control-Allow-Originसेट करना पड़ता है, लेकिन request स्वयं preflight के बिना भी स्वीकार की जाती है
- HTML 4.0 का
सवाल:
SameSitepolicy और यह तरीका आपस में consistency कैसे बनाए रखते हैं?
CSRF सुरक्षा के तरीके
- cross-site write requests की अनुमति होती है, लेकिन response share नहीं किया जाता
- ज़्यादातर websites cross-site write की अनुमति देना नहीं चाहतीं
- CSRF से बचाव का मानक तरीका
- user-specific CSRF token को request में शामिल करके verify करना
- तरीके:
- form submission: hidden input field के रूप में token जोड़ना
- JS requests: cookie या
metatag में store करके, फिर request header या parameter में शामिल करना
- JS requests मूल रूप से cross-site होने पर डिफ़ॉल्ट रूप से block होती हैं
- लेकिन same-site requests में इनकी अनुमति होती है
- CSRF token शामिल करने पर सभी requests को एक ही तरीके से verify किया जा सकता है
- अतिरिक्त सुरक्षा लाभ
- यह इस मान्यता पर काम करता है कि browser डिफ़ॉल्ट रूप से response reading को block करेगा
Originheader की जाँच करने की तुलना में यह अधिक सुरक्षित है
सवाल: कुछ frameworks CSRF token को समय-समय पर बदलते हैं. ऐसा क्यों?
Browser की भूमिका
- web security का मूल इस बात पर निर्भर करता है कि browser पर भरोसा किया जा सकता है या नहीं
- browser:
- same-origin policy लागू करता है
- अगर response की अनुमति नहीं है, तो उसे पढ़ने से रोकता है
- यह तय करता है कि
SameSite=Laxdefault लागू करना है या नहीं - CORS implement करता है और सुरक्षित preflight request भेजता है
हमें अपने इस्तेमाल किए जा रहे browser पर भरोसा करना पड़ता है.
निष्कर्ष
- अगर
SameSite=Laxको 100% browsers support करें, तो security और मज़बूत हो जाएगी, लेकिन
अभी भी स्थिति यह है कि cross-site POST requests ही अपवादस्वरूप अनुमति प्राप्त हैं - इसलिए developers को CSRF सुरक्षा पर लगातार ध्यान देना चाहिए
"इंटरनेट धीरे-धीरे अधिक सुरक्षित हो रहा है, लेकिन उसी अनुपात में पुराने सिस्टम्स के साथ compatibility भी घटती जा रही है."
1 टिप्पणियां
Hacker News राय
CORS एक ऐसा mechanism है जिसमें server browser को साफ़ तौर पर बताता है कि कौन-सी cross-origin requests response को पढ़ सकती हैं
evil.comका scriptbank.com/transactionsपर request भेजकर पीड़ित के transaction history को पढ़ने की कोशिश कर सकता हैbank.comतक पहुँचने देता है, लेकिनevil.comको response पढ़ने से रोक देता हैCSRF protection authenticated user की ओर से malicious cross-origin requests द्वारा बिना अनुमति actions किए जाने से रोकती है
evil.comका scriptbank.comपर action कराने के लिए request भेज सकता है (जैसे:bank.com/transfer?from=victim&to=hackerसे पैसे transfer करना)bank.comकी server-side CSRF protection इसे reject कर देती है (संभवतः इसलिए क्योंकि request में secret CSRF token शामिल नहीं होता)CSRF protection write protection से जुड़ी है, जबकि CORS read protection से जुड़ा है
JS से शुरू की गई requests में डिफ़ॉल्ट रूप से cross-site की अनुमति नहीं होती
fetch()का उपयोग करके allowed headers के साथ cross-site request शुरू की जा सकती हैलगता है कि इस विषय पर इससे बेहतर explanation मौजूद है
blog post के सवाल पर प्रतिक्रिया
<form>element किसी भी origin पर simple request submit कर सकता है2022 में MDN के CORS article में "simple request" शब्द की उत्पत्ति स्पष्ट करने के लिए एक paragraph जोड़ा गया था
SameSite=Laxको support करने या उसे default बनाने का कोई उल्लेख नहीं थायह बात उलझन पैदा करती है कि SameSite को CORS preflight से स्वतंत्र रूप से जोड़ा गया
यह मान लेना कि csrf का इस्तेमाल न करने पर भी चीज़ें सुरक्षित हैं, गलत हो सकता है; कुछ libraries (जैसे
django rest framework) content-type header सेट होने पर HTML form को process कर सकती हैंCSRF token को rotate करने की वजह पर सवाल
इस जटिल विषय के लिए flowchart की मांग
ये चीज़ें आसान diagnostic tracing को support नहीं करतीं
यह समझना कठिन है कि CORS आने से पहले page origin से अलग किसी भी endpoint पर request भेजना संभव क्यों था, लेकिन response देखना संभव नहीं था
CSRF protection को लेकर भ्रम
goodsite.comसे CSRF token लेकर उसेbadsite.comमें डालने और Alice कोbadsite.comसेgoodsite.comपर request submit करने के लिए फुसलाने से रोकने का तरीका क्या है