सुरक्षा
हमारा सुरक्षा मॉडल एक वाक्य में: सर्वर पर हमला करने के लिए कुछ है ही नहीं। नीचे दी गई हर बात आपके DevTools से सत्यापित की जा सकती है।
आर्किटेक्चर
Abundera QR एक स्थैतिक सिंगल-पेज एप्लिकेशन है जो Cloudflare Pages से परोसा जाता है। कोई एप्लिकेशन सर्वर नहीं, कोई डेटाबेस नहीं, कोई यूज़र अकाउंट नहीं, कोई प्रमाणीकरण नहीं, कोई API एंडपॉइंट नहीं, और कोई बैकएंड कोड पथ नहीं है जो उपयोगकर्ता डेटा को संसाधित करे। हर QR जनरेशन, एन्कोडिंग, स्कैनिंग और रेंडरिंग ऑपरेशन पूरी तरह आपके ब्राउज़र के अंदर चलता है।
खतरे का मॉडल
चूंकि हम कोई उपयोगकर्ता डेटा एकत्र, संग्रहीत या प्रसारित नहीं करते, सबसे सामान्य वेब-ऐप खतरे, क्रेडेंशियल चोरी, डेटाबेस उल्लंघन, सेशन हाइजैकिंग, सर्वर-साइड इंजेक्शन, लागू नहीं होते। शेष हमला सतह हमारे मूल स्रोत से परोसा जाने वाला स्थैतिक एसेट बंडल (HTML, CSS, JavaScript) है। हम यह मानकर डिज़ाइन करते हैं:
- ओरिजिन से समझौता: एक हमलावर हमारे बंडल किए गए एसेट में से किसी एक को दुर्भावनापूर्ण एसेट से बदल देता है। नीचे दी गई CSP विस्फोट की सीमा कम करती है; cache-buster टोकन किसी ज्ञात-अच्छे संस्करण पर वापस रोलबैक करना आसान बनाते हैं।
- उपयोगकर्ता द्वारा दिया गया इनपुट: QR पेलोड, vCard नाम, Wi-Fi पासवर्ड, बैच CSV पंक्तियाँ, स्कैन की गई छवि सामग्री। हर इनपुट पथ को DOM पर वापस रेंडर होने पर अविश्वसनीय माना जाता है।
- उपयोगकर्ता द्वारा दी गई छवियाँ: vCard फ़ोटो URL और लोगो अपलोड। छवियों को canvas में रेंडर किया जाता है, कभी भी raw मार्कअप के रूप में DOM में एम्बेड नहीं किया जाता।
- तृतीय-पक्ष ब्राउज़र एक्सटेंशन: दायरे से बाहर। यदि आपके ब्राउज़र में कोई एक्सटेंशन हर पेज को संशोधित करने की अनुमति रखता है, तो वह हमारे पेज को भी संशोधित कर सकता है। हमारी गारंटियाँ तब लागू होती हैं जब पेज अपरिवर्तित रूप से लोड किया गया हो।
कंटेंट सिक्योरिटी पॉलिसी, प्रत्येक निर्देश के अनुसार
वर्तमान नीति (किसी भी अनुरोध के लिए Response headers में सत्यापित करें):
Content-Security-Policy:
default-src 'self';
script-src 'self' 'wasm-unsafe-eval';
worker-src 'self' blob:;
style-src 'self' 'unsafe-inline';
font-src 'self';
img-src 'self' data: blob: https:;
connect-src 'self' https:;
frame-ancestors 'none';
base-uri 'self';
form-action 'self'प्रत्येक निर्देश हमें क्या करने देता है और कहाँ समझौता करता है:
default-src 'self', कठोर आधार। जो कुछ भी हम स्पष्ट रूप से ढील नहीं देते वह same-origin पर ही रहता है।script-src 'self' 'wasm-unsafe-eval', कोई inline<script>नहीं, कोईeval()नहीं।'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 होते हैं।connect-src 'self' https:, fetch() हमारे ओरिजिन और उपयोगकर्ता द्वारा शुरू किए गए HTTPS फेच (जैसे फ़ोटो URL स्कैन करना) तक सीमित है। DNS / WebSocket / beacon के माध्यम से मनमाने होस्ट पर डेटा एक्सफ़िल्ट्रेशन को रोकता है।frame-ancestors 'none', कोई अन्य साइट हमें embed नहीं कर सकती। clickjacking रोकता है।base-uri 'self', दुर्भावनापूर्ण रूप से inject किया गया<base>tag relative URL को हमलावर के ओरिजिन पर redirect नहीं कर सकता।form-action 'self', कोई भी inject किया गया form केवल हमारे ओरिजिन पर ही post कर सकता है। हमारे पास कोई form नहीं है जो server-side पर data भेजे; यह belt-and-suspenders है।
/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 को अस्वीकार करता है, आप GitHub पर logic पढ़ सकते हैं। 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