پارتیشن بندی ذخیره سازی

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

وضعیت پیاده‌سازی

این ویژگی برای همه کاربران در کروم ۱۱۵ و بالاتر فعال شده است. تلاش‌های مشابهی برای پارتیشن‌بندی فضای ذخیره‌سازی در سایر مرورگرهای اصلی مانند فایرفاکس و سافاری نیز در حال انجام یا برنامه‌ریزی است. پیشنهاد پارتیشن‌بندی فضای ذخیره‌سازی در گیت‌هاب برای بحث بیشتر باز است.

پارتیشن بندی فضای ذخیره سازی چیست؟

برای جلوگیری از انواع خاصی از ردیابی بین سایتی کانال جانبی، کروم APIهای ذخیره‌سازی و ارتباطات را در زمینه‌های شخص ثالث تقسیم‌بندی می‌کند.

بدون پارتیشن‌بندی ذخیره‌سازی، یک سایت می‌تواند داده‌ها را در سایت‌های مختلف به هم متصل کند تا کاربر را در سراسر وب ردیابی کند. همچنین، این امر به سایت جاسازی‌شده اجازه می‌دهد تا با استفاده از تکنیک‌های کانال جانبی مانند حملات زمان‌بندی ، XS-Leaks و COSI ، حالت‌های خاصی را در مورد کاربر در سایت سطح بالا استنباط کند.

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

به طور کلی، پارتیشن‌بندی به این معنی است که داده‌های نوشته شده توسط APIهای ذخیره‌سازی مانند Local Storage و IndexedDB درون یک iframe دیگر نمی‌توانند توسط همه contextهایی که منشأ یکسانی دارند، قابل دسترسی باشند. در عوض، آن داده‌ها اکنون ایزوله شده و فقط برای contextهایی که هم منشأ یکسانی دارند و هم سایت سطح بالای یکسانی دارند، در دسترس هستند.

قبل از

API های ذخیره سازی بدون پارتیشن بندی.
قبل از پارتیشن‌بندی ذخیره‌سازی، example.com می‌تواند داده‌ها را هنگام جاسازی در a.com بنویسد و سپس هنگام جاسازی در b.com آنها را بخواند.

بعد از

API های ذخیره سازی با پارتیشن بندی.
پس از پارتیشن‌بندی فضای ذخیره‌سازی، example.com، وقتی در b.com جاسازی شده باشد، نمی‌تواند به فضای ذخیره‌سازی example.com که در a.com جاسازی شده است، دسترسی داشته باشد.

پارتیشن‌بندی فضای ذخیره‌سازی روی iframeهای زنجیره‌ای

پیچیدگی پارتیشن‌بندی فضای ذخیره‌سازی زمانی که آی‌فریم‌ها تودرتو باشند، به طور قابل توجهی افزایش می‌یابد، به خصوص زمانی که یک مبدا چندین بار در زنجیره ظاهر شود.

برای مثال، A1 حاوی یک iframe برای B است که آن هم شامل یک iframe برای A2 است و هر دو A1 و A2 در یک سایت قرار دارند. اگر پارتیشن‌بندی فقط سایت سطح بالا و مبدا فریم فعلی را در نظر بگیرد، ممکن است iframe A2 به اشتباه به عنوان "شخص اول" در نظر گرفته شود زیرا یک سایت را با سطح بالا (A1) به اشتراک می‌گذارد، با وجود iframe بین سایتی B. این امر می‌تواند A2 را در معرض خطرات امنیتی مانند clickjacking قرار دهد، اگر A2 به طور پیش‌فرض به فضای ذخیره‌سازی پارتیشن‌بندی نشده دسترسی داشته باشد.

برای حل این مشکل، کروم یک "بیت اجداد" به کلید پارتیشن ذخیره‌سازی اضافه می‌کند. اگر هر سندی بین iframe فعلی و سایت سطح بالا از یک مبدا (بین‌سایتی) متفاوت باشد، این بیت تنظیم می‌شود. در این حالت، سایت B بین‌سایتی است، بنابراین بیت برای A2 تنظیم می‌شود و فضای ذخیره‌سازی آن از A1 پارتیشن‌بندی می‌شود.

وقتی زنجیره iframe صرفاً از زمینه‌های سایت یکسان تشکیل شده باشد (برای مثال، سایت A1 حاوی A2 باشد که آن هم شامل A3 می‌شود)، بیت جد، فضای ذخیره‌سازی آنها را بیشتر تقسیم نمی‌کند. در چنین مواردی، فضای ذخیره‌سازی آنها به صورت مشترک باقی می‌ماند و توسط مبدا مشترک و سایت سطح بالای آنها کلیدگذاری می‌شود.

برای سایت‌هایی که نیاز به دسترسی بدون پارتیشن‌بندی از طریق iframeهای زنجیره‌ای دارند، کروم در حال آزمایش گسترش API دسترسی به فضای ذخیره‌سازی است تا این مورد استفاده را فعال کند . از آنجایی که API دسترسی به فضای ذخیره‌سازی نیاز دارد که سایت فریم‌بندی شده صریحاً API را فراخوانی کند، این امر خطر کلیک‌ربایی را کاهش می‌دهد.

تغییرات API به دلیل پارتیشن‌بندی

APIهایی که تحت تأثیر پارتیشن‌بندی قرار می‌گیرند را می‌توان به گروه‌های زیر تقسیم کرد:

APIهای ذخیره‌سازی

  • سیستم سهمیه‌بندی
    سیستم سهمیه‌بندی برای تعیین میزان فضای دیسک اختصاص داده شده برای ذخیره‌سازی استفاده می‌شود. سیستم سهمیه‌بندی هر پارتیشن را به عنوان یک سطل جداگانه مدیریت می‌کند تا میزان فضای مجاز و زمان خالی شدن آن را تعیین کند.
    متد navigator.storage.estimate() اکنون اطلاعات مختص به پارتیشن ذخیره‌سازی را ارائه می‌دهد. APIهای مخصوص کروم مانند window.webkitStorageInfo و navigator.webkitTemporaryStorage منسوخ شده‌اند.
    IndexedDB و حافظه کش از سیستم سهمیه‌بندی پارتیشن‌بندی شده استفاده می‌کنند.
  • رابط برنامه‌نویسی کاربردی ذخیره‌سازی وب
    API ذخیره‌سازی وب، مکانیزم‌هایی را فراهم می‌کند که مرورگرها می‌توانند جفت‌های کلید-مقدار را ذخیره کنند. دو مکانیزم وجود دارد: ذخیره‌سازی محلی و ذخیره‌سازی جلسه‌ای . آنها سهمیه‌بندی‌شده نیستند، اما همچنان پارتیشن‌بندی شده‌اند.
  • سیستم فایل خصوصی Origin
    رابط برنامه‌نویسی کاربردی دسترسی به سیستم فایل (File System Access API) به یک سایت اجازه می‌دهد تا پس از اعطای دسترسی توسط کاربر، تغییرات را مستقیماً در فایل‌ها و پوشه‌های دستگاه بخواند یا ذخیره کند. سیستم فایل خصوصی Origin به یک origin این امکان را می‌دهد که محتوای خصوصی را مستقیماً روی دیسک ذخیره کند. این محتوا همچنان در دسترس کاربر است اما اکنون پارتیشن‌بندی شده است.
  • API سطل ذخیره‌سازی
    رابط برنامه‌نویسی کاربردی (API) سطل ذخیره‌سازی (Storage Bucket API) برای استاندارد ذخیره‌سازی (Storage Standard) در حال توسعه است که APIهای ذخیره‌سازی مختلفی مانند IndexedDB و localStorage را با استفاده از مفهوم جدیدی به نام سطل‌ها (buckets) تجمیع می‌کند. داده‌های ذخیره شده در سطل‌ها و فراداده‌های مرتبط با سطل‌ها، پارتیشن‌بندی می‌شوند.
  • هدر Clear-Site-Data
    گنجاندن هدر Clear-Site-Data در پاسخ به سرور اجازه می‌دهد تا درخواست پاک کردن داده‌های ذخیره شده در مرورگر کاربر را بدهد. حافظه پنهان (cache)، کوکی‌ها و فضای ذخیره‌سازی DOM قابل پاک شدن هستند. استفاده از این هدر فقط فضای ذخیره‌سازی درون یک پارتیشن را پاک می‌کند.
  • فروشگاه URL بلاب
    یک آدرس اینترنتی Blob دسترسی به یک blob ، یک شیء که داده‌های خام را در خود نگه می‌دارد، را فراهم می‌کند. بدون پارتیشن‌بندی ذخیره‌سازی، یک آدرس اینترنتی blob که در یک iframe شخص ثالث در یک سایت تولید شده است، می‌تواند در یک iframe با منشأ یکسان که در سایت دیگری تعبیه شده است، استفاده شود. به عنوان مثال، اگر iframe های example.com هم در a.com و هم در b.com تعبیه شده باشند، یک آدرس اینترنتی blob تولید شده در iframe تعبیه شده در a.com می‌تواند بدون هیچ محدودیتی به iframe تعبیه شده در b.com منتقل و سپس توسط آن استفاده شود. با شروع از کروم ۱۳۷ (منتشر شده در ۲۷ مه ۲۰۲۵)، آدرس‌های اینترنتی Blob برای همه کاربردها به جز پیمایش‌های سطح بالا، تقسیم‌بندی می‌شوند. مواردی که اکنون مسدود خواهند شد شامل مواردی است که آدرس‌های اینترنتی blob بین پارتیشنی با fetch() یا به عنوان مقدار ویژگی src برای عناصر مختلف HTML استفاده می‌شوند. پیمایش‌های سطح بالا، مانند فراخوانی window.open() یا کلیک روی پیوندی با target='_blank' ، به آدرس‌های اینترنتی Blob اگر cross-partition باشند مسدود نمی‌شوند، اما اگر سایت URL blob از سایت سطح بالای صفحه‌ای که پیمایش را آغاز می‌کند، cross-site باشد، noopener اعمال خواهد شد. اعمال noopener به این معنی است که سندی که پیمایش را آغاز می‌کند، از دریافت یک دسته پنجره برای سند URL blob که باز کرده است، جلوگیری می‌شود. در مثال قبلی، پارتیشن‌بندی مانع از دریافت محتوای URL blob توسط iframe در b.com می‌شود، اما همچنان می‌تواند آن را window.open() کند.

API های ارتباطی

در کنار APIهای ذخیره‌سازی، APIهای ارتباطی که به یک زمینه اجازه می‌دهند تا در مرزهای مبدا ارتباط برقرار کند نیز تقسیم‌بندی شده‌اند. این تغییرات عمدتاً بر APIهایی تأثیر می‌گذارند که امکان کشف زمینه‌های دیگر را با استفاده از پخش یا ملاقات با مبدا یکسان فراهم می‌کنند.

به دلیل پارتیشن‌بندی، APIهای ارتباطی زیر از تبادل داده‌ها توسط iframeهای شخص ثالث با contextهای مبدا یکسانشان جلوگیری می‌کنند:

  • کانال پخش
    رابط برنامه‌نویسی کاربردی کانال پخش (Broadcast Channel API) امکان ارتباط بین زمینه‌های مرور (پنجره‌ها، تب‌ها یا iframeها) و کارگران (worker) با منشأ یکسان را فراهم می‌کند.
    پیشنهاد نمی‌شود که رفتار تابع postMessage() بین سایتی iframe تغییر کند، زیرا رابطه بین این زمینه‌ها از قبل به وضوح تعریف شده است.
  • کارگر مشترک
    رابط برنامه‌نویسی کاربردی SharedWorker، یک worker فراهم می‌کند که می‌توان از طریق مرور محتواهای با منشأ یکسان به آن دسترسی داشت.
  • قفل‌های وب
    API قفل‌های وب به کدی که در یک تب یا ورکر با منشأ یکسان اجرا می‌شود، اجازه می‌دهد تا در حین انجام برخی کارها، قفلی برای یک منبع مشترک به دست آورد.

API سرویس ورکر

API سرویس ورکر به سایت‌ها اجازه می‌دهد تا وظایفی را در پس‌زمینه انجام دهند. سایت‌ها، سرویس ورکرهایی را ثبت می‌کنند که زمینه‌های جدیدی برای پاسخ به رویدادها ایجاد می‌کنند. به طور سنتی، این سرویس ورکرها می‌توانستند با هر زمینه‌ای با منشأ یکسان ارتباط برقرار کنند. با این حال، از آنجا که سرویس ورکرها می‌توانند زمان‌بندی درخواست‌های ناوبری را تغییر دهند، خطر نشت اطلاعات بین سایتی مانند شنود تاریخچه را ایجاد می‌کنند.

به همین دلیل، Service Workerهایی که از یک context شخص ثالث ثبت شده‌اند، اکنون پارتیشن‌بندی شده‌اند.

APIهای افزونه

افزونه‌ها برنامه‌هایی هستند که به کاربران امکان می‌دهند تجربه مرور خود را سفارشی کنند.

صفحات افزونه (صفحاتی با طرح chrome-extension:// ) می‌توانند در سایت‌های سراسر وب جاسازی شوند. در این سناریو، صفحات افزونه همچنان به پارتیشن سطح بالای خود دسترسی دارند. افزونه‌ها همچنین می‌توانند سایت‌های دیگر را جاسازی کنند؛ وقتی این کار را انجام می‌دهند، آن سایت‌های جاسازی شده به پارتیشن سطح بالای خود دسترسی خواهند داشت، مشروط بر اینکه افزونه مجوزهای میزبان برای آنها را داشته باشد.

برای اطلاعات بیشتر، به مستندات افزونه مراجعه کنید.

نسخه آزمایشی: آزمایش پارتیشن‌بندی فضای ذخیره‌سازی

سایت نسخه آزمایشی: https://storage-partitioning-demo-site-a.glitch.me/

سایت آزمایشی که تیک‌های سبز را در سمت چپ و ضربدرهای قرمز را در سمت راست نشان می‌دهد.
تصویر صفحه نمایش، خروجی مرورگر با پارتیشن‌بندی فضای ذخیره‌سازی در سمت چپ و بدون پارتیشن‌بندی فضای ذخیره‌سازی در سمت راست را نشان می‌دهد.

این نسخه آزمایشی از دو سایت استفاده می‌کند: سایت A و سایت B.

  • وقتی از سایت A در زمینه سطح بالا بازدید می‌کنید، داده‌ها را با استفاده از روش‌های مختلف ذخیره‌سازی تنظیم می‌کند.
  • سایت B صفحه‌ای از سایت A را در خود جاسازی می‌کند و آن جاسازی سعی می‌کند گزینه‌های ذخیره‌سازی تنظیم‌شده قبلی را بخواند.
  • وقتی سایت A در سایت B تعبیه شده باشد، هنگام پارتیشن‌بندی فضای ذخیره‌سازی، به آن داده‌ها دسترسی ندارد و بنابراین خواندن با شکست مواجه می‌شود.
  • این نسخه آزمایشی از موفقیت یا شکست هر خواندن برای نشان دادن اینکه آیا داده‌ها پارتیشن‌بندی شده‌اند یا خیر، استفاده می‌کند.

فعلاً می‌توانید پارتیشن‌بندی فضای ذخیره‌سازی را در کروم با استفاده از کلید خط فرمان --disable-features=ThirdPartyStoragePartitioning غیرفعال کنید. توجه: این کلید خط فرمان برای اهداف توسعه و آزمایش در نظر گرفته شده است و ممکن است در نسخه‌های بعدی کروم حذف یا تغییر کند.

همچنین می‌توانید مرورگرهای دیگر را نیز به همین روش آزمایش کنید تا وضعیت پارتیشن‌بندی آنها را مشاهده کنید.

درخواست زمان مهاجرت اضافی

برای سایت‌هایی که برای انتقال وابستگی‌های خود به زمان بیشتری نیاز دارند، دوره آزمایشی منسوخ شدن DisableThirdPartyStoragePartitioning3 اکنون تمدید شده است. این دوره آزمایشی، مکانیسمی موقت برای سایت‌های سطح بالا ارائه می‌دهد تا از ذخیره‌سازی پارتیشن‌بندی نشده ، سرویس ورکرها و APIهای ارتباطی برای زمینه‌های شخص ثالث تعبیه شده در صفحات خود استفاده کنند.

برای کسب اطلاعات بیشتر، به تمدید نسخه آزمایشی منسوخ‌شده پارتیشن‌بندی ذخیره‌سازی مراجعه کنید.

مشارکت کنید و بازخورد خود را به اشتراک بگذارید