سیکیورٹی
ہمارا سیکیورٹی ماڈل ایک جملے میں: سرور پر حملہ کرنے کے لیے کچھ ہے ہی نہیں۔ نیچے دی گئی ہر بات آپ کے DevTools سے قابل تصدیق ہے۔
آرکیٹیکچر
یہ جنریٹر ایک اسٹیٹک سنگل پیج ایپلیکیشن ہے جو Cloudflare Pages سے پیش کی جاتی ہے: کوئی یوزر اکاؤنٹ نہیں، کوئی تصدیق نہیں، اور جنریشن فلو میں کہیں بھی کوئی بیک اینڈ کوڈ پاتھ نہیں۔ ہر QR جنریشن، انکوڈنگ، اسکیننگ اور رینڈرنگ آپریشن مکمل طور پر آپ کے براؤزر کے اندر چلتا ہے۔ اس کے ساتھ ایک چھوٹا serverless endpoint بھی موجود ہے اور اسے چھپانے کی بجائے یہاں درج کیا جا رہا ہے: /api/contact (رابطہ فارم، جو آپ کے جمع کردہ ڈیٹا کو Cloudflare D1 میں محفوظ کرتا ہے اور ہمیں ای میل کرتا ہے)۔ QR کوڈ بناتے وقت اسے کال نہیں کیا جاتا؛ URL سیفٹی چیکر ایک علیحدہ پروڈکٹ ہے جو check.qr.abundera.ai پر ہے۔ QR کوڈ محفوظ ہے یا نہیں جانچیں
خطرے کا ماڈل
چونکہ یہ جنریٹر کوئی یوزر ڈیٹا جمع، ذخیرہ یا منتقل نہیں کرتا (اوپر دیے گئے دونوں endpoints صرف وہی ڈیٹا ہینڈل کرتے ہیں جو آپ خود انہیں بھیجتے ہیں)، ویب ایپ کے سب سے عام خطرات, کریڈینشل چوری، ڈیٹابیس لیک، سیشن ہائی جیکنگ، سرور سائیڈ انجیکشن, اس پر لاگو نہیں ہوتے۔ باقی ماندہ حملے کی سطح ہمارے اصل سے پیش کردہ اسٹیٹک اثاثہ بنڈل (HTML، CSS، JavaScript) ہے۔ ہم فرض کر کے ڈیزائن کرتے ہیں:
- اصل کی سمجھوتہ کاری: حملہ آور ہمارے بنڈل شدہ اثاثوں میں سے کسی ایک کو نقصاندہ سے بدل دیتا ہے۔ نیچے دیا گیا CSP دھماکے کا دائرہ محدود کرتا ہے؛ cache-buster ٹوکنز معلوم-درست ورژن پر واپسی آسان بناتے ہیں۔
- یوزر کی طرف سے دیا گیا ان پٹ: QR پے لوڈ، vCard نام، WiFi پاسورڈ، بیچ CSV قطاریں، اسکین کردہ تصویر کا مواد۔ ہر ان پٹ پاتھ کو ناقابل اعتماد سمجھا جاتا ہے جب وہ DOM میں واپس رینڈر ہوتا ہے۔
- یوزر کی طرف سے دی گئی تصاویر: vCard فوٹو URLs اور لوگو اپلوڈ۔ تصاویر کو canvas پر رینڈر کیا جاتا ہے، کبھی DOM میں خام مارک اپ کے طور پر شامل نہیں کیا جاتا۔
- تھرڈ پارٹی براؤزر ایکسٹینشن: دائرے سے باہر۔ اگر آپ کے براؤزر میں کسی ایکسٹینشن کو ہر صفحہ تبدیل کرنے کی اجازت ہے تو وہ ہمارا صفحہ بھی تبدیل کر سکتی ہے۔ ہماری ضمانتیں اس وقت لاگو ہوتی ہیں جب صفحہ غیر تبدیل شدہ لوڈ کیا گیا ہو۔
Content Security Policy, ڈائریکٹیو کے مطابق
نیچے دی گئی پالیسی اس صفحے کے build ہونے کے وقت deploy شدہ _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ہمارا اپنا parent domain ہے اور ایک مشترکہ اسکرپٹ, زبان منتخب کرنے والا, پیش کرتا ہے۔challenges.cloudflare.comTurnstile widget ہے جو صرف /contact/ پر استعمال ہوتا ہے۔'wasm-unsafe-eval'ہماری QR انکوڈر لائبریری کے WebAssembly کمپائلیشن پاتھ کے لیے ضروری ہے؛ یہ روایتیeval()کی اجازت نہیں دیتا۔ ہماری اپنی پری-ڈیپلوائے چیک ہر HTML صفحے پر inline scripts اسکین کرتی ہے اور بلڈ ناکام کر دیتی ہے۔style-src 'self' 'unsafe-inline', ایک حقیقی رعایت۔ ہمارا QR پریویو inline میں پکسل سطح کے رنگ حساب کرتا ہے (انفرادی ماڈیولز پر style attributes)۔ Hash-based allowlist کام کرتا لیکن بغیر ڈیپلوائے کے کسی بھی style اپڈیٹ پر ناکام ہو جاتا۔ سمجھوتہ: ہم قدرے کمزور style پالیسی قبول کرتے ہیں؛ styling بہرحال ڈیٹا نہیں نکال سکتی (CSS کی کوئیconnect-srcرسائی نہیں)۔img-src 'self' data: blob: https:, inline QR رینڈر کے لیےdata:، ایکسپورٹ ڈاؤن لوڈ URLs کے لیےblob:، یوزر کی طرف سے دیے گئے vCard فوٹو اور avatar URLs کے لیےhttps:۔ یوزر کے دیے گئے URLs کبھی execute نہیں ہوتے، صرف رینڈر ہوتے ہیں۔ یاد رہے کہ یہ directive ایک آؤٹ باؤنڈ چینل بھی ہے: صفحے پر چلنے والا کوئی بھی اسکرپٹ کسی بھی HTTPS host سے تصویر کی درخواست کر سکتا ہے اور URL میں ڈیٹا رکھ سکتا ہے۔ ہم اسے قبول کرتے ہیں کیونکہ فیچر کو اس کی ضرورت ہے، اور ہم اسے پالیسی کو ناقابلِ نفوذ بتانے کی بجائے یہاں واضح طور پر بیان کرتے ہیں۔connect-src 'self' https: https://challenges.cloudflare.com, یہ وہ ایک ہے جسے غور سے پڑھنا چاہیے۔https:ایک scheme source ہے: یہfetch()، XMLHttpRequest، TLS پر WebSocket، EventSource اورsendBeacon()کو کسی بھی HTTPS origin تک پہنچنے دیتا ہے، نہ کہ صرف ان تک جو آپ نے ٹائپ کیے۔ یہ اس لیے ہے تاکہ vCard فوٹو فیلڈ اور URL سیفٹی چیک اس پتے کو فیچ کر سکیں جو آپ نے پیسٹ کیا۔ یہ کسی بدنیت اسکرپٹ کی طرف سے exfiltration نہیں روکتا؛ ایک بار جب اسکرپٹ ہمارے طور پر چل رہا ہو تو کوئی بھی CSP directive یہ نہیں روکتی۔ exfiltration کو کیا روکتا ہے یہ ہے کہ ہمارا شپ کردہ کوڈ ایسی کوئی درخواست نہیں کرتا، جسے آپ Network ٹیب میں دیکھ سکتے ہیں۔frame-src 'self' https://challenges.cloudflare.com, صرف Turnstile widget کو frame کیا جا سکتا ہے۔frame-ancestors 'none', کوئی دوسری سائٹ ہمیں embed نہیں کر سکتی۔ clickjacking روکتا ہے۔base-uri 'self', inject کردہ نقصاندہ<base>ٹیگ relative URLs کو حملہ آور کے اصل پر redirect نہیں کر سکتا۔form-action 'self', کوئی بھی inject کردہ form صرف ہمارے اصل پر post کر سکتا ہے۔ رابطہ فارم واحد فارم ہے جو کہیں بھی submit کرتا ہے۔
CSP کیا نہیں کر سکتا
CSP یہ محدود کرتا ہے کہ براؤزر کہاں سے کوڈ لوڈ کرے گا۔ یہ جانچ نہیں کرتا کہ لوڈ شدہ کوڈ کیا کرتا ہے۔ اگر ہمارا اصل سمجھوتہ کا شکار ہو جائے, خطرے کے ماڈل کی پہلی چیز, تو حملہ آور کا اسکرپٹ اسی اجازتوں کے ساتھ چلے گا جو ہمارے پاس ہیں، بشمول اوپر دیے گئے connect-src اور img-src کی رعایتیں۔ اس کے خلاف ہمارا دفاع CSP سے پہلے کی سطح پر ہے: تعیناتیاں ایک ہی Cloudflare اکاؤنٹ سے scoped tokens کے ذریعے جاتی ہیں، اثاثوں کے فائل نام content-hashed ہیں تاکہ بدلی ہوئی فائل ہر اس URL کو بدل دے جو اسے حوالہ دیتا ہے، اور سروس ورکر صرف same-origin GET responses کیش کرتا ہے۔ منشور سائٹ کو جیسا شپ کی گئی ہے ویسا بیان کرتا ہے۔ یہ یہ دعویٰ نہیں کہ کوئی ویب صفحہ کبھی کہیں ڈیٹا نہیں بھیج سکتا، اور ہم چاہیں گے کہ آپ ہمیں اس تنگ تر، قابلِ تصدیق بیان پر پرکھیں۔
/bio/* (یوزر کے دیے گئے avatars کے لیے ڈھیلا img-src) اور /embed/* (جان بوجھ کر embedding کے لیے ڈھیلا frame-ancestors) پر الگ CSP پالیسیاں لاگو ہوتی ہیں۔ دونوں site/_headers میں دستاویز شدہ ہیں۔
ٹرانسپورٹ + فریمنگ ہیڈرز
- HSTS:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload, ۱ سال، تمام subdomains، HSTS preload list کے لیے اہل۔ HTTP پر downgrade کو معتبر براؤزرز مسترد کرتے ہیں۔ - X-Frame-Options: DENY, CSP
frame-ancestorsکے ساتھ redundant، پرانے براؤزر کوریج کے لیے رکھا گیا ہے۔ - X-Content-Type-Options: nosniff, MIME confusion حملوں کو روکتا ہے۔
- Referrer-Policy: strict-origin-when-cross-origin, آؤٹ باؤنڈ لنک کلکس origin ظاہر کرتے ہیں لیکن path نہیں۔
- Permissions-Policy:
camera=(self), microphone=(), geolocation=(), کیمرہ صرف ہمارے اپنے اسکینر کے لیے اجازت یافتہ؛ مائیک اور لوکیشن embed ہونے پر بھی واضح طور پر مسترد۔
سروس ورکر
ہمارا سروس ورکر (site/sw.js) صرف same-origin اثاثے cache کرتا ہے۔ fetch handler واضح طور پر cross-origin درخواستیں اور non-GET طریقے مسترد کرتا ہے, آپ /sw.js میں logic پڑھ سکتے ہیں (source اتنا unminified شپ ہوتا ہے کہ اسے فالو کیا جا سکے)۔ Cache writes event.waitUntil() میں لپٹے ہوئے ہیں تاکہ navigation کے دوران ڈراپ نہ ہوں۔
ان پٹ صفائی
ہر رینڈرنگ پاتھ جو یوزر ان پٹ قبول کرتا ہے اسے ناقابل اعتماد متن کے طور پر برتتا ہے:
- QR پے لوڈ پریویوز
textContentاستعمال کرتے ہیں،innerHTMLنہیں۔ - Share targets (clipboard،
navigator.share()) یوزر متن کو string کے طور پر پاس کرتے ہیں، کبھی markup کے طور پر نہیں۔ - SVG ایکسپورٹ ہماری انکوڈر لائبریری سے تیار ہوتے ہیں؛ یوزر مواد
<image>xlink:hrefمیں base64-encoded ہوتا ہے، SVG elements کے طور پر inject نہیں۔ - پرنٹ پریویو blob URL استعمال کرتا ہے،
document.write()نہیں۔ - localStorage parsing
try/catchمیں لپٹی ہوئی ہے, خراب entry ایک تازہ خالی default دیتی ہے، کبھی ایسا exception نہیں جو live code path میں unwind ہو سکے۔ - "لنک کھولیں" بٹن کے طور پر دکھائے گئے یوزر کے دیے گئے URLs
http(s)://تک محدود ہیں,javascript:اورdata:schemes مسترد۔
کراس اورجن امیج فیچنگ
جب کوئی یوزر vCard فوٹو یا لوگو کے طور پر کوئی https: URL پیسٹ کرتا ہے تو براؤزر اسے CORS اور ہمارے CSP کی img-src allowlist کے تابع فیچ کرتا ہے۔ تصویر canvas پر رینڈر ہوتی ہے۔ یہ کبھی live DOM نہیں بنتی، کبھی code کے طور پر نہیں چلتی، اور کبھی ہمارے اصل تک نہیں پہنچتی, فیچ براؤزر → remote image ہے، اور نتیجہ client-side پر paint ہوتا ہے۔ remote image URL کنٹرول کرنے والا حملہ آور یہ ٹریک کر سکتا ہے کہ URL لوڈ ہوا (اپنے سرور پر ایک log line) لیکن ہمارے صفحے سے کچھ نہیں نکال سکتا۔
Subresource Integrity (SRI)
ہم جو JavaScript اور CSS ship کرتے ہیں وہ سب same-origin ہے۔ ہم کوئی تھرڈ پارٹی scripts یا stylesheets لوڈ نہیں کرتے، اس لیے SRI hashes لاگو نہیں ہوتے۔ اگر ہم کبھی کوئی تھرڈ پارٹی اثاثہ لوڈ کریں گے تو اس پر SRI integrity attribute ship کریں گے اور hash-update process اس صفحے پر دستاویز کریں گے۔
خطرے کی اطلاع دینا
اگر آپ Abundera QR کو متاثر کرنے والا کوئی سیکیورٹی مسئلہ دریافت کریں, چاہے ہمارے کوڈ، ہماری تعیناتی یا ہم جو dependency ship کرتے ہیں اس میں, براہ کرم اسے نجی طور پر security@abundera.ai کو رپورٹ کریں۔ ہم ۷۲ گھنٹوں میں triage کرنے کا ہدف رکھتے ہیں۔ آپ ہمارے /.well-known/security.txt فائل میں رابطے کی تفصیلات کے ذریعے بھی رابطہ کر سکتے ہیں۔
کوئی bug bounty نہیں (ابھی کے لیے)
ہم ابھی ادائیگی شدہ انعامات پیش نہیں کرتے، لیکن ہر تصدیق شدہ درست رپورٹ کو changelog میں credit اور ہمارا عوامی شکریہ ملتا ہے۔
مندرجہ بالا کسی بھی بات کی تصدیق کریں
اس صفحے پر ہر دعوی آپ کے براؤزر کے DevTools سے ہم پر اعتماد کیے بغیر قابل تصدیق ہے:
- CSP: DevTools → Network →
/→ Headers۔Content-Security-Policyresponse header پڑھیں۔ - HSTS + سیکیورٹی ہیڈرز: اسی جگہ, تمام
Strict-Transport-Security،X-Frame-Optionsوغیرہ نظر آتے ہیں۔ - کوئی آؤٹ باؤنڈ calls نہیں: DevTools → Network → Fetch/XHR۔ QR بنائیں۔ count صفر رہتا دیکھیں۔
- سروس ورکر scope: DevTools → Application → Service Workers۔ script source اور cached asset list تصدیق کریں۔
- کوئی cookies نہیں: DevTools → Application → Cookies۔ خالی۔
- مکمل walkthrough: manifesto کا verification section۔
رابطہ
سیکیورٹی انکشافات: security@abundera.ai