iframe ایمبیڈ چیکر
مفت آن لائن ifram چیکر: کسی بھی ویب پیج کا URL درج کریں تاکہ اس کے X-Frame-Options اور Content-Security-Policy frame-ancestors ہیڈرز کا معائنہ کیا جا سکے، یہ معلوم کریں کہ کیا پیج ifram میں اینبڈ ہو سکتا ہے، اور لائیو پریویو کے ساتھ تصدیق کریں۔ تاریخ موجودہ براؤزر سییشن کے لیے محفوظ رہتی ہے۔
تاریخ (اس سییشن کی)
یہ صرف اس ٹیب میں محفوظ ہوتا ہے (sessionStorage)؛ ٹیب بند کرنے پر خود بخود صاف ہو جاتا ہے۔ سرور کو کوئی ڈیٹا ارسال نہیں کیا جاتا۔
یہ چیک کس طرح کام کرتا ہے؟
- ہدف URL درج کریں اور 'Check' پر کلک کریں۔ سرور پیج کو ایک اصلی ifram ریکویسٹ کی شکل میں فetcہ کرتا ہے (Sec-Fetch-Dest: iframe سمیت) اور اس کے رسپانس ہیڈرز پڑھتا ہے۔
- فیصلہ X-Frame-Options (DENY / SAMEORIGIN فریمنگ کو روکتے ہیں) اور Content-Security-Policy frame-ancestors (صرف * یا سکیم وائلڈ کارڈ تھرڈ پارنٹس کو اجازت دیتے ہیں) کی بنیاد پر دیا جاتا ہے۔
- لائو پریویو ifram میں وہی URL لوڈ کیا جاتا ہے تاکہ آپ تصدیق کر سکیں کہ براؤزر دراصل کیا کر رہا ہے، بشمول جیساکرپٹ فريم بسٹنگ جو ہیڈرز ظاہر نہیں کر سکتے۔
کیا طے کرتا ہے کہ کیا کوئی پیج اینبڈ ہو سکتا ہے؟
کہ آیا ایک ویب پیج کسی دیگر سائٹ پر `<iframe>` کے اندر دکھایا جا سکتا ہے، اس کا فیصلہ براؤزر کرتا ہے، جو اس صفحے خود بھیجے گئے رسپانس ہیڈرز کی بنیاد پر ہوتا ہے۔ یہ چیکنر اسی جانچ کو سرور سائیڈ پر انجام دیتا ہے اور آپ کو فوراً نتیجہ بتاتا ہے۔
`X-Frame-Options` روایتی ہیڈر ہے: `DENY` ہر صفحے پر فریمنگ منع کرتا ہے، `SAMEORIGIN` صرف یکساں اوریجن والے صفحات کو فریم کرنے کی اجازت دیتا ہے، اور `ALLOW-FROM` جدید براؤزرز میں ہٹا دیا گیا ہے۔ جب یہ ہیڈر غائب ہو تو قدیم قوانین فریمنگ کو روکتے نہیں ہیں۔
`Content-Security-Policy frame-ancestors` جدید متبادل ہے۔ یہ ان اوریجنز کی فہرست ہوتا ہے جو پیج کو ایمبیڈ کرنے کی مجاز ہیں — مثال کے طور پر `frame-ancestors 'self' https://example.com`۔ `*` (یا محض `https:` جیسی اسکیم) کی قدر کسی بھی HTTPS والد (parent) کو اجازت دیتی ہے؛ اس سے تنگ تر کوئی بھی چیز تھرڈ پارٹی ایمبیڈنگ کو بلاک کر دے گی۔
ہیڈرز کہانی کے تمام پہلو نہیں ہیں: پیج اسکرپٹس فریم باسٹنگ کوڈ چلا سکتے ہیں (`top !== self` موازنہ کر کے اور ٹاپ لیول نیویگیشن پر زور دے کر)، اور لاگ ان صفحات یا جغرافیائی پابندی والے اینڈ پوائنٹس ڈیٹا سینٹر درخواستوں کے لیے مختلف رویہ اپنا سکتے ہیں۔ اسی لیے ہر نتیجے کے ساتھ لائیو پریویو بھی فراہم کیا جاتا ہے۔
فوری رہنمائی: رسپانس ہیڈر کی ترتیب
اگر آپ اس سائٹ کے مالک ہیں، تو رسپانس ہیڈرز کے ذریعے فریمنگ کو براہ راست کنٹرول کریں۔
کسی بھی صفحے سے ایمبیڈنگ بلاک کریں
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
براؤزر کسی بھی `<iframe>` میں اس صفحے کو ظاہر کرنے سے انکار کر دیتے ہیں — یہ کلک جیکنگ کے خلاف سخت ترین حفاظتی اقدام ہے۔
صرف یکساں اوریجن والی ایمبیڈنگ کی اجازت دیں
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
صرف وہی صفحات جو ایک ہی اسکیم، ہوسٹ اور پورٹ رکھتے ہوں اسے فریم میں ڈال سکتے ہیں؛ تھرڈ پارٹی سائٹس بلاک کردی جائیں گی۔
صرف مخصوص اوریجنز کی اجازت دیں
Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com
`frame-ancestors` میں معتبر اوریجنز کی فہرست درج کریں؛ جن کی فہرست میں شامل نہیں وہ بلاک ہو جائیں گے۔
کسی بھی صفحے سے ایمبیڈنگ کی اجازت دیں
X-Frame-Options سیٹ نہ کریں
Content-Security-Policy: frame-ancestors *
کوئی بھی سائٹ اس صفحے کو `<iframe>` میں رکھ سکتی ہے۔ سیکیورٹی کے فوائد اور نقصانات کا جائزہ ضرور لیں۔
نوٹ: CSP کا `frame-ancestors` اب `X-Frame-Options` کی جگہ لے چکا ہے۔ جب دونوں موجود ہوں تو CSP ترجیح دی جاتی ہے — `frame-ancestors` استعمال کریں۔
سرور کیسے پہچانتا ہے کہ کوئی درخواست ifram سے آئی ہے؟
تقریباً 2020 سے کرومیم اور فائر فاکس پر مبنی براؤزرز خود بخود ہر نیویگیشن اور سب ریسورس درخواست کے ساتھ فچ میٹا ڈیٹا ری کوئسٹ ہیڈرز کا ایک سیٹ منسلک کر دیتے ہیں۔ فریمنگ چیکز کے لیے سب سے مفید `Sec-Fetch-Dest` ہے — یہ سرور کو بتاتا ہے کہ کس قسم کے سیاق و سباق (context) نے ریسورس کی درخواست کی، بغیر کسی تعاون کے درخواستی صفحے کے۔
- Sec-Fetch-Dest: document — ٹاپ لیول نیویگیشن، کسی بھی فریم کے اندر نہیں۔
- Sec-Fetch-Dest: iframe — یہ درخواست `<iframe>` عنصر کے اندر لوڈ ہوتی ہے۔
- Sec-Fetch-Dest: frame — پرانے `<frame>` (فریم سیٹ) کے اندر لوڈ ہوتا ہے۔
- Sec-Fetch-Dest: embed / object — `<embed>` یا `<object>` عنصر کے اندر لوڈ ہوتا ہے۔
یہ چیکر اپنا پراب `Sec-Fetch-Dest: iframe` ہیڈر کے ساتھ بھیجتا ہے، جو کہ کسی اصلی براؤزر کی طرف سے کسی صفحے کو embed کرنے کے دوران بھیجے جانے والے بالکل یکساں ڈیٹا کی نقل ہوتا ہے۔ لہٰذا اس کا نتیجہ اس بات کا عکس بنتا ہے کہ ٹارگٹ سرور حقیقی `iframe` ریکویسٹس پر کیسے برتاؤ کرتا ہے، نہ کہ کسی عام HTTP fetch پر۔
`Sec-Fetch-Dest` ایک مفید اشارہ تو ہے لیکن سیکیورٹی کا معیار نہیں: یہ صرف جدید براؤزرز بھیجتے ہیں، جبکہ غیر براؤزر کلائنٹس — مثلاً curl، بوٹس، بعض ویب ووز (webviews) اور پرانے براؤزرز — اسے مکمل طور پر چھوڑ سکتے ہیں یا کوئی بھی حسبِ خواہش قدر بھیج سکتے ہیں۔ سرور کو چاہیے کہ اس کی بنیاد پر لاگنگ یا ریٹ لمیٹنگ کا فیصلہ کرے، مگر فریمنگ کی اجازت کے بارے میں صرف اسی پر انحصار نہیں کرنا چاہیے؛ یہ فیصلہ دراصل `X-Frame-Options` اور `CSP frame-ancestors` پر منحصر ہے، جنہیں براؤزرز درخواست کے ہیڈرز سے آزادانہ طور پر نافذ کرتے ہیں۔
کلائنٹ سائیڈ پر، کوئی بھی صفحہ بغیر کسی ہیڈر کے بھی یہ محسوس کر سکتا ہے کہ وہ کسی فریم کے اندر چل رہا ہے، مثلاً `window.top !== window.self` کے موازنے سے (یا سین اوپوجین فریمز کے لیے `window.frameElement` پڑھ کر)۔ اس کے بعد وہ مناسب ردعمل ظاہر کر سکتا ہے — جیسے وارننگ دکھانا یا ٹاپ لیول ریڈائریکٹ کروانا۔ یہ وہی فریم بَسٹنگ (frame-busting) تکنیک ہے جو پہلے بیان کی گئی تھی، اور یہ درخواست کے ہیڈرز میں کیا بھی موجود ہو، مستقل طور پر کام کرتی ہے۔
سرور کنفیگ مثالیں: ifram اینبیڈنگ بلاک کریں
ذیل کے کوڈ سنیپٹس دکھاتے ہیں کہ ہر سرور یا فریم ورک کو کیسے ترتیب دیں تاکہ `iframe` ایمبیڈنگ مکمل طور پر بلاک ہو جائے (X-Frame-Options: DENY + CSP frame-ancestors 'none') — یہ اوپر دی گئی فوری رہنمائی کے تمام طریقوں میں سب سے سخت قدم ہے۔
server {
location / {
add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "frame-ancestors 'none'" always;
}
}
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
Header always set Content-Security-Policy "frame-ancestors 'none'"
</IfModule>
app.use((req, res, next) => {
res.setHeader('X-Frame-Options', 'DENY');
res.setHeader('Content-Security-Policy', "frame-ancestors 'none'");
next();
});
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/:path*',
headers: [
{ key: 'X-Frame-Options', value: 'DENY' },
{ key: 'Content-Security-Policy', value: "frame-ancestors 'none'" },
],
},
];
},
};
class SetFrameOptions
{
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
$response->headers->set('X-Frame-Options', 'DENY');
$response->headers->set('Content-Security-Policy', "frame-ancestors 'none'");
return $response;
}
}
export default {
async fetch(request) {
const response = await fetch(request);
const headers = new Headers(response.headers);
headers.set('X-Frame-Options', 'DENY');
headers.set('Content-Security-Policy', "frame-ancestors 'none'");
return new Response(response.body, { status: response.status, headers });
},
};
صرف اپنے سائٹ یا مختصر اجازت فہرست (allow-list) کو فریم کرنے کی اجازت دینی ہے، باقی سب کو بلاک کرنے کی بجائے؟ `DENY` کو `SAMEORIGIN` اور `'none'` کو `'self'` یا مخصوص اوریجنز کی فہرست سے بدل دیں — باقی ترتیب ویسی ہی رہے گی۔
مشہور پلیٹ فارمز کے احتیاطی نکات
عمومی ہیڈر قوانین کو جانب رکھتے ہوئے، کچھ معروف پلیٹ فارمز کے اپنے مخصوص رویے ہیں — انہیں جان لینا ضروری ہے، اس سے پہلے کہ آپ صرف ہیڈرز کی بنیاد پر یہ فرض کر لیں کہ کوئی چیز "بلکڈ" (blocked) ہے یا "ایمبیڈ ایبل" (embeddable) ہو سکتی ہے۔
| پلیٹ فارم / منظرنامہ | رویہ | وجوہات |
|---|---|---|
| یوٹیوب واچ پیج (youtube.com/watch) | مسدود | متبادل کے طور پر باضابطہ `youtube.com/embed/{id}` پلے یوز استعمال کریں — عام واچ پیج سخت فریم پالیسی بھیجتا ہے۔ |
| گوگل میپس پلیس پیج | مسدود | صرف میپس ایمبیڈ API کا آئی فریم یوز (google.com/maps/embed) فریمنگ کے لیے مقرر کیا گیا ہے۔ |
| گوگل / مائیکرو سافٹ OAuth لوگن پیجز | مسدود | 2015 سے جان بوجھ کر بلاک کیا گیا ہے تاکہ iframe کے اندر کرینشل فیشنگ (credential-phishing) کو روکا جا سکے؛ لوگن فلو کو ٹاپ لیول ونڈو یا پاپ اپ میں چلنا ضروری ہے۔ |
| پیمنٹ چیڪ آؤٹ پیجز (Stripe Checkout، PayPal، زیادہ تر بینک گیٹ ویز) | مسدود | پیمنٹ فارم کو iframe میں ڈالنا کلک جیکنگ (clickjacking) کا کلاسک طریقہ ہے، اس لیے پیمنٹ پروسیسرز اسے براہ مسترد کر دیتے ہیں۔ |
| گیٹ ہب repository / فائل پیجز | مسدود | سائٹ وائیڈ `frame-ancestors 'none'`؛ iframe کے بجائے REST/GraphQL API یا اسکرین شاٹ استعمال کریں۔ |
| نوٹر / گوگل ڈاکس "Publish to web" پیجز | قابلِ انبیڈ | خاص طور پر ایمبیڈنگ کے لیے ڈیزائن کیے گئے ہیں، اور پروڈکٹ میں تیار شدہ ایمبیڈ کوڈ فراہم کیا گیا ہے۔ |
| وکیپیڈیا مضامین | قابلِ انبیڈ | ڈیفالٹ طور پر کوئی محدود `X-Frame-Options`/CSP موجود نہیں ہے، مگر بڑے پیمانے پر انبیڈ کرنے سے پہلے لائسنسنگ اور کارآمد شرطوں کا جائزہ ضرور لیں۔ |
عام استعمال کے موارد
- انٹیگریشن کوڈ لکھنے سے پہلے یہ طے کریں کہ آیا کوئی تھर्ड پارٹی وڈجٹ، ڈیش بورڈ، یا دستاویز اپنے پروڈکٹ میں ایمبیڈ کی جا سکتی ہے یا نہیں۔
- تصدیق کریں کہ آپ کا اپنا سائٹ وہی `X-Frame-Options` یا `CSP frame-ancestors` پالیسی بھیج رہا ہے جس کا آپ ارادہ کرتے ہیں۔
- کلک جیکنگ تحفظ کی ڈیبگنگ کریں: یہ سمجھنے کے لیے کہ کوئی صفحہ آئی فریم کے اندر about:blank یا کسی انکار کے پیغام کو کیوں دکھا رہا ہے۔
- مواد جمع کرنے یا پورٹل انضمام کے دوران متعلقہ URLs کو جمع وار اسکریں کریں، اور نتائج کو دوبارہ جانچنے کے لیے سیشن ہسٹری استعمال کریں۔
- بیرونی ڈیپنڈنسیز (External Dependencies) کی فریمنگ پالیسی کو دستاویز بنا کر سیکیورٹی ریویوز یا پیینیٹریشن ٹیسٹس کے لیے تیاری کریں۔