सुरक्षा
हमारा सुरक्षा मॉडल एक वाक्य में: सर्वर पर हमला करने के लिए कुछ है ही नहीं। नीचे दी गई हर बात आपके DevTools से सत्यापित की जा सकती है।
आर्किटेक्चर
जनरेटर एक स्थैतिक सिंगल-पेज एप्लिकेशन है जो Cloudflare Pages से परोसा जाता है: कोई यूज़र अकाउंट नहीं, कोई प्रमाणीकरण नहीं, और जेनरेशन फ़्लो में कहीं भी कोई बैकएंड कोड पथ नहीं है। हर QR जनरेशन, एन्कोडिंग, स्कैनिंग और रेंडरिंग ऑपरेशन पूरी तरह आपके ब्राउज़र के अंदर चलता है। इसके साथ एक छोटा सर्वरलेस एंडपॉइंट है जिसे छिपाने के बजाय यहाँ सूचीबद्ध किया गया है: /api/contact (संपर्क फ़ॉर्म, जो आपके सबमिट किए गए डेटा को Cloudflare D1 में संग्रहीत करता है और हमें ईमेल करता है)। QR कोड बनाते समय इसे कॉल नहीं किया जाता; URL सुरक्षा जांच check.qr.abundera.ai पर एक अलग उत्पाद है। QR कोड सुरक्षित है या नहीं जांचें
खतरे का मॉडल
चूंकि जनरेटर कोई उपयोगकर्ता डेटा एकत्र, संग्रहीत या प्रसारित नहीं करता (ऊपर दिए गए दोनों एंडपॉइंट केवल वही संभालते हैं जो आप उन्हें स्पष्ट रूप से भेजते हैं), सबसे सामान्य वेब-ऐप खतरे, क्रेडेंशियल चोरी, डेटाबेस उल्लंघन, सेशन हाइजैकिंग, सर्वर-साइड इंजेक्शन, इस पर लागू नहीं होते। शेष हमला सतह हमारे मूल स्रोत से परोसा जाने वाला स्थैतिक एसेट बंडल (HTML, CSS, JavaScript) है। हम यह मानकर डिज़ाइन करते हैं:
- ओरिजिन से समझौता: एक हमलावर हमारे बंडल किए गए एसेट में से किसी एक को दुर्भावनापूर्ण एसेट से बदल देता है। नीचे दी गई CSP विस्फोट की सीमा कम करती है; cache-buster टोकन किसी ज्ञात-अच्छे संस्करण पर वापस रोलबैक करना आसान बनाते हैं।
- उपयोगकर्ता द्वारा दिया गया इनपुट: QR पेलोड, vCard नाम, Wi-Fi पासवर्ड, बैच CSV पंक्तियाँ, स्कैन की गई छवि सामग्री। हर इनपुट पथ को DOM पर वापस रेंडर होने पर अविश्वसनीय माना जाता है।
- उपयोगकर्ता द्वारा दी गई छवियाँ: vCard फ़ोटो URL और लोगो अपलोड। छवियों को canvas में रेंडर किया जाता है, कभी भी raw मार्कअप के रूप में DOM में एम्बेड नहीं किया जाता।
- तृतीय-पक्ष ब्राउज़र एक्सटेंशन: दायरे से बाहर। यदि आपके ब्राउज़र में कोई एक्सटेंशन हर पेज को संशोधित करने की अनुमति रखता है, तो वह हमारे पेज को भी संशोधित कर सकता है। हमारी गारंटियाँ तब लागू होती हैं जब पेज अपरिवर्तित रूप से लोड किया गया हो।
कंटेंट सिक्योरिटी पॉलिसी, प्रत्येक निर्देश के अनुसार
नीचे दी गई नीति इस पेज के बिल्ड होने पर डिप्लॉय किए गए _headers फ़ाइल से पढ़ी जाती है, इसलिए यह उससे अलग नहीं हो सकती जो edge भेजता है। इसे किसी भी अनुरोध के response headers में सत्यापित करें।
Content-Security-Policy:
default-src 'self';
script-src 'self' https://abundera.ai 'wasm-unsafe-eval' https://challenges.cloudflare.com;
worker-src 'self' blob:;
style-src 'self' 'unsafe-inline' https://abundera.ai;
font-src 'self';
img-src 'self' data: blob: https:;
connect-src 'self' https: https://challenges.cloudflare.com;
frame-src 'self' https://challenges.cloudflare.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self'प्रत्येक निर्देश हमें क्या करने देता है और कहाँ समझौता करता है:
default-src 'self', कठोर आधार। जो कुछ भी हम स्पष्ट रूप से ढील नहीं देते वह same-origin पर ही रहता है।script-src 'self' https://abundera.ai 'wasm-unsafe-eval' https://challenges.cloudflare.com, कोई inline<script>नहीं, कोईeval()नहीं।abundera.aiहमारा अपना पैरेंट डोमेन है और एक साझा स्क्रिप्ट, भाषा चयनकर्ता, परोसता है।challenges.cloudflare.comTurnstile widget है जो केवल /contact/ पर उपयोग होता है।'wasm-unsafe-eval'हमारी QR एन्कोडर लाइब्रेरी के WebAssembly कंपाइलेशन पथ के लिए आवश्यक है; यह पारंपरिकeval()की अनुमति नहीं देता। हमारी प्री-डिप्लॉय जाँच हर HTML पेज को inline स्क्रिप्ट के लिए स्कैन करती है और मिलने पर बिल्ड विफल कर देती है।style-src 'self' 'unsafe-inline', एक वास्तविक रियायत। हमारा QR प्रीव्यू पिक्सल-स्तरीय रंगों को inline (अलग-अलग मॉड्यूल पर style attribute) में कंप्यूट करता है। हैश-आधारित allowlist काम करेगी लेकिन किसी भी style अपडेट पर बिना deploy के विफल हो जाएगी। ट्रेडऑफ़: हम थोड़ी कमज़ोर style नीति स्वीकार करते हैं; styling डेटा एक्सफ़िल्ट्रेट नहीं कर सकती (CSS के पासconnect-srcकी पहुँच नहीं है)।img-src 'self' data: blob: https:,data:inline QR रेंडर के लिए,blob:एक्सपोर्ट डाउनलोड URL के लिए,https:उपयोगकर्ता द्वारा दिए गए vCard फ़ोटो और अवतार URL के लिए। उपयोगकर्ता द्वारा दिए गए URL कभी execute नहीं होते, केवल render होते हैं। ध्यान दें कि यह directive एक आउटबाउंड चैनल भी है: पेज पर चल रही कोई भी स्क्रिप्ट किसी भी HTTPS host से एक image request कर सकती है और URL में डेटा डाल सकती है। हम इसे स्वीकार करते हैं क्योंकि फीचर को इसकी ज़रूरत है, और हम इसे यहाँ खुलकर बताते हैं, नीति को वॉटरटाइट बताने के बजाय।connect-src 'self' https: https://challenges.cloudflare.com, ध्यान से पढ़ने वाला।https:एक scheme source है: यहfetch(), XMLHttpRequest, TLS पर WebSocket, EventSource औरsendBeacon()को किसी भी HTTPS ओरिजिन तक पहुँचने देता है, केवल उन्हीं तक नहीं जो आपने टाइप किए। यह इसलिए है ताकि vCard फ़ोटो फ़ील्ड और URL सुरक्षा जांच वह पता fetch कर सकें जो आपने पेस्ट किया। यह किसी दुर्भावनापूर्ण स्क्रिप्ट द्वारा एक्सफ़िल्ट्रेशन को नहीं रोकता; एक बार स्क्रिप्ट हमारे रूप में चल रही हो तो कोई भी CSP directive यह नहीं रोकता। एक्सफ़िल्ट्रेशन को क्या रोकता है, यह कि हमारा shipped कोड ऐसा कोई request नहीं बनाता, जिसे आप Network टैब में देख सकते हैं।frame-src 'self' https://challenges.cloudflare.com, केवल Turnstile widget को frame किया जा सकता है।frame-ancestors 'none', कोई अन्य साइट हमें embed नहीं कर सकती। clickjacking रोकता है।base-uri 'self', दुर्भावनापूर्ण रूप से inject किया गया<base>tag relative URL को हमलावर के ओरिजिन पर redirect नहीं कर सकता।form-action 'self', कोई भी inject किया गया form केवल हमारे ओरिजिन पर ही post कर सकता है। संपर्क फ़ॉर्म ही एकमात्र फ़ॉर्म है जो कहीं भी submit करता है।
CSP क्या नहीं कर सकता
CSP यह सीमित करता है कि ब्राउज़र कहाँ से कोड लोड करेगा। यह जाँच नहीं करता कि लोड किया गया कोड क्या करता है। अगर हमारा ओरिजिन compromise हो जाए, जो threat model में पहला आइटम है, तो हमलावर की स्क्रिप्ट वही permissions के साथ चलेगी जो हमारी हैं, जिसमें ऊपर दिए गए connect-src और img-src की छूट भी शामिल है। इसके खिलाफ हमारी सुरक्षा CSP से पहले बैठती है: deploys एक ही Cloudflare account से scoped tokens के साथ जाते हैं, asset filenames content-hashed होते हैं ताकि बदली गई फ़ाइल उसे संदर्भित करने वाले हर URL को बदल दे, और service worker केवल same-origin GET responses cache करता है। घोषणापत्र साइट को जैसे shipped है वैसे बताता है। यह यह दावा नहीं है कि कोई भी वेब पेज कभी कहीं डेटा नहीं भेज सकता, और हम चाहेंगे कि आप हमें इस संकरे, जाँचने-योग्य बयान पर परखें।
/bio/* (उपयोगकर्ता द्वारा दिए गए अवतार के लिए img-src में ढील) और /embed/* (जानबूझकर embedding के लिए frame-ancestors में ढील) पर अलग-अलग CSP नीतियाँ लागू होती हैं। दोनों site/_headers में documented हैं।
ट्रांसपोर्ट + फ्रेमिंग हेडर
- HSTS:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload, 1 वर्ष, सभी subdomains, HSTS preload list के लिए पात्र। अनुपालन करने वाले ब्राउज़र HTTP में डाउनग्रेड करने से इनकार करते हैं। - X-Frame-Options: DENY, CSP
frame-ancestorsके साथ अतिरेक, पुराने ब्राउज़र कवरेज के लिए रखा गया। - X-Content-Type-Options: nosniff, MIME confusion हमलों को रोकता है।
- Referrer-Policy: strict-origin-when-cross-origin, आउटबाउंड लिंक क्लिक ओरिजिन लीक करते हैं लेकिन पथ नहीं।
- Permissions-Policy:
camera=(self), microphone=(), geolocation=(), कैमरा केवल हमारे अपने scanner के लिए अनुमत; mic और location embed होने पर भी स्पष्ट रूप से अस्वीकार।
Service Worker
हमारा Service Worker (site/sw.js) केवल same-origin एसेट cache करता है। fetch handler स्पष्ट रूप से cross-origin अनुरोधों और गैर-GET methods को अस्वीकार करता है, आप /sw.js में logic पढ़ सकते हैं (सोर्स इतना unminified शिप होता है कि उसे फॉलो किया जा सके)। Cache writes को event.waitUntil() में wrap किया गया है ताकि वे navigation के बीच में drop न हों।
इनपुट sanitization
उपयोगकर्ता इनपुट स्वीकार करने वाला हर rendering path उसे अविश्वसनीय text मानता है:
- QR payload previews
innerHTMLनहीं,textContentउपयोग करते हैं। - Share targets (clipboard,
navigator.share()) उपयोगकर्ता text को markup के रूप में नहीं, string के रूप में पास करते हैं। - SVG exports हमारी encoder library से generate होते हैं; उपयोगकर्ता सामग्री
<image>xlink:hrefमें base64-encoded होती है, SVG elements के रूप में inject नहीं। - Print previews
document.write()नहीं, blob URL उपयोग करते हैं। - localStorage parsing
try/catchमें wrap है, एक corrupt entry fresh empty default देती है, कोई exception नहीं जो live code path में unwind हो सके। - "Open link" बटन के रूप में दिखाए गए उपयोगकर्ता द्वारा दिए गए URL
http(s)://तक प्रतिबंधित हैं,javascript:औरdata:schemes अस्वीकार किए जाते हैं।
Cross-origin image fetching
जब कोई उपयोगकर्ता vCard फ़ोटो या logo के रूप में https: URL पेस्ट करता है, तो ब्राउज़र इसे CORS और हमारी CSP की img-src allowlist के अधीन fetch करता है। छवि canvas में render होती है। यह कभी live DOM नहीं बनती, कभी code के रूप में नहीं चलती, और कभी हमारे ओरिजिन तक नहीं पहुँचती, fetch browser → remote image है, और result client-side paint होता है। remote image URL को control करने वाला हमलावर track कर सकता है कि URL load हुआ (उनके सर्वर पर एक log line) लेकिन हमारे page से कुछ भी exfiltrate नहीं कर सकता।
Subresource Integrity (SRI)
हम जो भी JavaScript और CSS ship करते हैं वह same-origin है। हम कोई third-party scripts या stylesheets load नहीं करते, इसलिए SRI hashes लागू नहीं होते। यदि हम कभी third-party asset load करें, तो हम उस पर SRI integrity attribute ship करेंगे और इस page में hash-update process document करेंगे।
कोई भेद्यता रिपोर्ट करना
यदि आप Abundera QR को प्रभावित करने वाला कोई सुरक्षा मुद्दा खोजते हैं, चाहे हमारे code में, हमारे deployment में, या किसी dependency में जो हम ship करते हैं, कृपया इसे निजी तौर पर security@abundera.ai को रिपोर्ट करें। हम 72 घंटों के भीतर triage करने का लक्ष्य रखते हैं। आप हमारी /.well-known/security.txt फ़ाइल में संपर्क विवरण के माध्यम से भी हमसे संपर्क कर सकते हैं।
कोई bug bounty नहीं (अभी के लिए)
हम वर्तमान में paid bounties प्रदान नहीं करते, लेकिन हर पुष्टि की गई वैध रिपोर्ट को changelog में credit और हमारा सार्वजनिक धन्यवाद मिलता है।
उपरोक्त किसी भी बात को सत्यापित करें
इस page पर हर दावा आपके ब्राउज़र के DevTools से हम पर भरोसा किए बिना falsifiable है:
- CSP: DevTools → Network →
/→ Headers।Content-Security-Policyresponse header पढ़ें। - HSTS + security headers: उसी जगह, सभी
Strict-Transport-Security,X-Frame-Options, आदि दिखाई देते हैं। - कोई outbound calls नहीं: DevTools → Network → Fetch/XHR। एक QR generate करें। count शून्य रहते देखें।
- Service worker scope: DevTools → Application → Service Workers। script source और cached asset list सत्यापित करें।
- कोई cookies नहीं: DevTools → Application → Cookies। खाली।
- पूरा walkthrough: manifesto का verification section।
संपर्क
सुरक्षा प्रकटीकरण: security@abundera.ai