Chrome تغییر document.domain را غیرفعال می‌کند

اگر وب سایت شما به تنظیم document.domain متکی است، اقدام شما ضروری است.

چه چیزی در حال تغییر است و چرا؟

از Chrome 115 ، وب‌سایت‌ها نمی‌توانند document.domain تنظیم کنند: Chrome document.domain غیرقابل تغییر می‌کند. برای برقراری ارتباط با مبدا متقابل، باید از رویکردهای جایگزین، مانند postMessage() یا Channel Messaging API استفاده کنید.

توجه داشته باشید که این تغییر به تدریج اعمال خواهد شد.

ما انتظار داریم مرورگرهای دیگر در نهایت این قابلیت را منسوخ کرده و حذف کنند. برای جزئیات، بخش سازگاری مرورگر را مرور کنید.

چرا document.domain تغییرناپذیر کنیم؟

document.domain برای دریافت یا تنظیم نام میزبان مبدا طراحی شده است. بسیاری از وب‌سایت‌ها document.domain تنظیم می‌کنند تا امکان ارتباط بین صفحات هم‌سایت اما متقاطع را فراهم کنند.

در حالی که این یک تکنیک راحت است، اما یک خطر امنیتی را معرفی می کند، زیرا سیاست همان مبدأ را کاهش می دهد . نگرانی های امنیتی در مورد document.domain منجر به تغییر در مشخصات شده است که به کاربران هشدار می دهد از استفاده از آن خودداری کنند .

در جزئیات: چرا document.domain را تغییرناپذیر کنیم؟

چگونه document.domain امروزه استفاده می شود

بسیاری از وب‌سایت‌ها document.domain تنظیم می‌کنند تا امکان ارتباط بین صفحات هم‌سایت اما متقاطع را فراهم کنند.

سایت های یکسان اما متقاطع دارای eTLD+1 یکسان اما زیردامنه های متفاوت هستند.

در اینجا نحوه استفاده از document.domain تا کنون آمده است:

فرض کنید صفحه‌ای در https://parent.example.com یک صفحه iframe را از https://video.example.com جاسازی می‌کند. این صفحات دارای eTLD+1 یکسان ( example.com ) با زیر دامنه های مختلف هستند. هنگامی که هر دو صفحه document.domain روی 'example.com' تنظیم می شود، مرورگر با دو مبدا به گونه ای برخورد می کند که گویی یک منبع هستند.

document.domain برای https://parent.example.com تنظیم کنید:

// Confirm the current origin of "parent.example.com"
console.log(document.domain);

// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);

document.domain برای https://video.example.com تنظیم کنید:

// Confirm the current origin of "video.example.com"
console.log(document.domain);

// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);

اکنون می توانید در https://parent.example.com در مقابل https://video.example.com یک دستکاری DOM با منبع متقاطع ایجاد کنید.

وب‌سایت‌ها document.domain تنظیم می‌کنند تا امکان ارتباط آسان‌تر اسناد همان سایت را فراهم کنند. از آنجایی که این تغییر خط مشی مبدا یکسان را کاهش می دهد ، صفحه اصلی می تواند به سند iframe دسترسی داشته باشد و درخت DOM را طی کند و بالعکس.

این یک تکنیک راحت است، با این حال یک خطر امنیتی را معرفی می کند.

نگرانی های امنیتی با document.domain

نگرانی های امنیتی در مورد document.domain منجر به تغییر در مشخصات شده است که به کاربران هشدار می دهد از استفاده از آن خودداری کنند .

به عنوان مثال، وقتی دو صفحه document.domain تنظیم می‌کنند، می‌توانند وانمود کنند که یک منبع هستند. این به ویژه زمانی که این صفحات از یک سرویس میزبانی مشترک با زیر دامنه های مختلف استفاده می کنند بسیار مهم است. تنظیم document.domain دسترسی به سایر سایت‌های میزبانی شده توسط همان سرویس را باز می‌کند، که دسترسی مهاجمان به سایت‌های شما را آسان‌تر می‌کند. این امکان پذیر است زیرا document.domain قسمت شماره پورت دامنه را نادیده می گیرد.

برای کسب اطلاعات بیشتر در مورد مفاهیم امنیتی تنظیم document.domain ، صفحه "Document.domain" را در MDN بخوانید.

سازگاری با مرورگر

چگونه بفهمم سایت من تحت تاثیر قرار گرفته است؟

اگر وب‌سایت شما تحت تأثیر این تغییر قرار گیرد، Chrome در پانل مشکلات DevTools به شما هشدار می‌دهد — این هشدار در سال 2022 اضافه شده است. به پرچم زرد بالای سمت راست DevTools توجه کنید.

تصویری از هشدار مشکل در DevTools

همچنین می‌توانید سایت خود را از طریق ممیزی API منسوخ شده LightHouse اجرا کنید تا همه APIهایی را که قرار است از Chrome حذف شوند، پیدا کنید.

اگر گزارش API را راه‌اندازی کرده‌اید، Chrome گزارش‌های منسوخ شدن را برای شما ارسال کرده است تا شما را از این منسوخ شدن آینده مطلع کند. درباره نحوه استفاده از Reporting API با خدمات جمع‌آوری گزارش‌های موجود یا با ساخت راه‌حل داخلی خود، بیشتر بیاموزید.

چگونه می توانم این تغییر را در عمل ببینم؟

این تغییر به تدریج از Chrome 115 شروع می‌شود. برای مشاهده عملکرد این تغییر حتی اگر قبلاً در مرورگر کروم شما منتشر نشده باشد، می‌توانید آن را به صورت زیر روشن کنید:

  1. chrome://flags/#origin-agent-cluster-default باز کنید
  2. Enable را انتخاب کنید.
  3. کروم را مجددا راه اندازی کنید.

از چه جایگزین هایی می توانم استفاده کنم؟

بهترین گزینه این است که به هیچ وجه document.domain تغییر ندهید، برای مثال با میزبانی صفحه و همه فریم های تشکیل دهنده در یک مبدا. این در تمام نسخه های همه مرورگرها کار می کند. اما این ممکن است نیاز به کار مجدد قابل توجهی از یک برنامه داشته باشد، بنابراین ارزش آن را دارد که به جایگزین هایی نیز نگاه کنیم که همچنان از دسترسی های متقاطع پشتیبانی می کنند.

به جای document.domain از postMessage() یا Channel Messaging API استفاده کنید

در بیشتر موارد استفاده، postMessage() cross-origin یا Channel Messaging API می‌تواند جایگزین document.domain شود.

در مثال زیر:

  1. https://parent.example.com https://video.example.com در iframe درخواست می کند تا با ارسال پیام از طریق postMessage() DOM را دستکاری کند.
  2. https://video.example.com به محض دریافت پیام، DOM را دستکاری می کند و موفقیت را به والدین اطلاع می دهد.
  3. https://parent.example.com موفقیت را تصدیق می کند.

در https://parent.example.com :

// Send a message to https://video.example.com
iframe.postMessage('Request DOM manipulation', 'https://video.example.com');

// Receive messages
iframe.addEventListener('message', (event) => {
  // Reject all messages except ones from https://video.example.com
  if (event.origin !== 'https://video.example.com') return;

  // Filter success messages
  if (event.data === 'succeeded') {
    // DOM manipulation is succeeded
  }
});

در https://video.example.com :

// Receive messages
window.addEventListener('message', (event) => {
  // Reject all messages except ones from https://parent.example.com
  if (event.origin !== 'https://parent.example.com') return;

  // Do a DOM manipulation on https://video.example.com.

  // Send a success message to https://parent.example.com
  event.source.postMessage('succeeded', event.origin);
});

آن را امتحان کنید و ببینید چگونه کار می کند. اگر شرایط خاصی دارید که با postMessage() یا Channel Messaging API کار نمی‌کند، در Twitter از طریق ChromiumDev@ به ما اطلاع دهید یا در Stack Overflow با یک برچسب document.domain سؤال کنید.

به عنوان آخرین راه حل، سرصفحه Origin-Agent-Cluster: ?0 ارسال کنید

اگر دلایل محکمی برای ادامه تنظیم document.domain دارید، می توانید سرصفحه پاسخ Origin-Agent-Cluster: ?0 را به همراه سند هدف ارسال کنید.

Origin-Agent-Cluster: ?0

سرصفحه Origin-Agent-Cluster به مرورگر دستور می دهد که آیا سند باید توسط کلاستر عامل با کلید اصلی مدیریت شود یا خیر. برای کسب اطلاعات بیشتر درباره Origin-Agent-Cluster ، درخواست جداسازی عملکرد با سرصفحه Origin-Agent-Cluster بخوانید.

وقتی این هدر را ارسال می‌کنید، سند شما می‌تواند به تنظیم document.domain ادامه دهد، حتی پس از اینکه به‌طور پیش‌فرض تغییرناپذیر شد.

تمام اسناد دیگری که به این رفتار نیاز دارند نیز باید یک Origin-Agent-Cluster ارسال کنند (توجه داشته باشید که اگر فقط یک سند آن را تنظیم کند document.domain تأثیری ندارد).

OriginAgentClusterDefaultEnabled را برای خط مشی سازمانی پیکربندی کنید

اختیاری، سرپرست شما می‌تواند خط‌مشی OriginAgentClusterDefaultEnabled را روی false پیکربندی کند تا document.domain به‌طور پیش‌فرض در نمونه‌های Chrome در سراسر سازمان شما قابل تنظیم باشد. برای کسب اطلاعات بیشتر، فهرست و مدیریت خط‌مشی Chrome Enterprise | مستندات .

منابع

سپاسگزاریها

عکس از فینان اکبر در Unsplash