جلوگیری از درج صفحات سایت در سایتی دیگر از طریق iframeها
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

یکی از مواردی را که به کرات در ارجاع دهنده‌های سایت مشاهده می‌کنم، درج صفحات سایت به صورت iframe داخل یک سری سایت‌های تبلیغاتی بسیار سطحی است. سؤال: چگونه می‌توان جلوی این حرکت نامطلوب را گرفت؟
برای این‌کار نیاز است اسکریپت ذیل را به ابتدای اسکریپت‌های سایت خود اضافه کنید:
function defrm() {
    document.write = '';
    window.top.location = window.self.location;
    setTimeout(function () {
        document.body.innerHTML = '';
    }, 0);
    window.self.onload = function (evt) {
        document.body.innerHTML = '';
    };
}
if (window.top !== window.self) {
    try {
        if (window.top.location.host)
        { /* will throw */ }
        else {
            defrm(); /* chrome */
        }
    } catch (ex) {
        defrm(); /* everyone else */
    }
}
اگر شیء window.top با شیء window.self یکی نبود (یعنی window جاری، window رویی نبود)، بنابراین صفحه‌ی جاری، داخل iframe قرار گرفته‌است. همچنین برای اطمینان بیشتر می‌توان window.top.location.host را نیز فراخوانی کرد. مرورگرهای جدید امکان دسترسی به دومین والد را از طریق یک iframe نمی‌دهند و همینجا یک استثناء صادر خواهد شد.
در مرحله بعد، با فراخوانی window.top.location = window.self.location و سایر کدهایی که مشاهده می‌کنید، کل صفحه را به صورت خودکار به سایت خودمان هدایت خواهیم کرد.

این مورد را نیز می‌توان به مجموعه best practices اجباری تهیه یک سایت اضافه کرد.
  • #
    ‫۱۰ سال و ۱۰ ماه قبل، یکشنبه ۲۴ آذر ۱۳۹۲، ساعت ۱۲:۳۴
    استفاده از  X-FRAME-OPTIONS در هدر درخواست با مقدار  SAMEORIGIN با DENY کفایت نمیکنه؟ 
    • #
      ‫۱۰ سال و ۱۰ ماه قبل، یکشنبه ۲۴ آذر ۱۳۹۲، ساعت ۱۲:۵۰
      خوبه ؛ فقط redirect بحث شده در مطلب را نداره
  • #
    ‫۱۰ سال و ۹ ماه قبل، چهارشنبه ۲۷ آذر ۱۳۹۲، ساعت ۱۲:۴۹
    با سلام؛ اگر بخواهیم این موردی رو که اشاره کردید رو دور بزنیم چطور باید عمل کنیم منظورم اینه که اگر سایتی همچین قابلیتی رو اضافه کرده بود چطور از بین ببریمش ؟
    • #
      ‫۱۰ سال و ۹ ماه قبل، چهارشنبه ۲۷ آذر ۱۳۹۲، ساعت ۱۲:۵۶
      حداقل با استفاده از جاوا اسکریپت، به دلایل امنیتی، امکان دسترسی به محتویات یک iframe بارگذاری شده از سایت دیگری را ندارید؛ مگر اینکه سمت سرور، محتویات آن صفحه را دریافت و در ادامه این صفحه‌ی محلی شده را نشان دهید.
  • #
    ‫۱۰ سال و ۶ ماه قبل، پنجشنبه ۲۹ اسفند ۱۳۹۲، ساعت ۰۱:۴۰
    سلام
    آیا سمت سرور راهی هست که بتوان تشخیص داد صفحاتی که درخواست داده می‌شوند از درون یک Iframe فرخوانی می‌شوند یا خیر(به طور خاص در ASP.NET MVC)
       
    • #
      ‫۱۰ سال و ۶ ماه قبل، پنجشنبه ۲۹ اسفند ۱۳۹۲، ساعت ۰۲:۲۹
      خیر. راه حل تشخیص سمت سرور، ندارد. هیچ هدر خاصی برای مشخص سازی درخواست اجرای یک صفحه از درون یک IFrame طراحی نشده‌است. حداکثر می‌توان Request.UrlReferrer را بررسی کرد (ولی اطمینانی به آن نیست. چون عوامل زیادی در تغییر آن دخیل هستند؛ از مرورگر تا فایروال و غیره)