دور زدن JavaScript Frame-Busting قدیمی با sandbox
چرا کد جاوااسکریپتی که سعی میکند از طریق top.location خودش را از iframe آزاد کند، یک دفاع واقعی نیست.
قبل از استاندارد شدن X-Frame-Options، سایتها با کدی شبیه if (top != self) top.location = self.location; سعی میکردند از frame شدن جلوگیری کنند. اما مهاجم میتواند iframe را با ویژگی sandbox="allow-forms" (بدون allow-scripts) بسازد؛ در این حالت هیچ جاوااسکریپتی داخل iframe (از جمله همین کد frame-busting) اجرا نمیشود، و دفاع کاملاً بیاثر میشود.
درس کلی
هر دفاع امنیتی که صرفاً سمت کلاینت و با جاوااسکریپت اجرا شود، توسط کنترل مهاجم روی محیط اجرای آن کد (iframe sandbox) قابلخلعسلاح است.
راهحل
فقط به هدرهای HTTP (X-Frame-Options / CSP) که توسط مرورگر *قبل* از اجرای هر جاوااسکریپت اعمال میشوند، اعتماد شود.