X-Frame-Options یک هدر امنیتی HTTP است که از سایت در برابر حملات Clickjacking محافظت می‌کند. در این حمله، مهاجم سایت قربانی را در یک iframe نامرئی بارگذاری می‌کند و کاربر را فریب می‌دهد تا روی عناصر مخفی کلیک کند. X-Frame-Options با تعیین اینکه آیا سایت می‌تواند در iframe بارگذاری شود، این حمله را خنثی می‌کند. این هدر از سال ۲۰۰۹ معرفی شد و امروزه در تمام مرورگرهای مدرن پشتیبانی می‌شود. با وجود معرفی Content-Security-Policy (CSP) که گزینه‌های پیشرفته‌تری ارائه می‌دهد، X-Frame-Options همچنان مهم است چون در مرورگرهای قدیمی‌تر پشتیبانی می‌شود و مکمل CSP است. در وردپرس، به‌ویژه در سایت‌هایی که امکان Embed شدن دارند یا از iframe برای نمایش محتوا استفاده می‌کنند، تنظیم X-Frame-Options یک ضرورت امنیتی است. این مقاله چارچوب کامل پیاده‌سازی X-Frame-Options در وردپرس، از دستورات پایه تا تنظیمات پیشرفته و تعامل با CSP، را ارائه می‌دهد. در یک پروژه، سایت وردپرسی قربانی حمله Clickjacking شد: مهاجم یک iframe نامرئی از صفحه ورود سایت ساخته بود و کاربران را فریب می‌داد تا روی دکمه‌های مخفی کلیک کنند. بعد از پیاده‌سازی X-Frame-Options با دستور `DENY`، همان حمله خنثی شد چون مرورگر از بارگذاری سایت در iframe جلوگیری کرد. این تجربه، اهمیت این هدر را در یک کلمه خلاصه می‌کند: محافظت.

X-Frame-Options چیست و چرا هنوز مهم است؟

X-Frame-Options یک هدر امنیتی HTTP است که تعیین می‌کند آیا یک صفحه می‌تواند در iframe یا frame بارگذاری شود. این هدر در سال ۲۰۰۹ توسط Microsoft معرفی شد و در سال ۲۰۱۳ به‌عنوان استاندارد RFC 7034 منتشر شد. اگر با X-Frame-Options آشنا شده باشید، می‌دانید که این هدر یکی از قدیمی‌ترین هدرهای امنیتی است.

مهم بودن X-Frame-Options با وجود CSP از چند جهت قابل تحلیل است. اول، پشتیبانی مرورگرهای قدیمی: CSP در مرورگرهای قدیمی (مثل IE 11) پشتیبانی نمی‌شود، در حالی که X-Frame-Options در تمام مرورگرها پشتیبانی می‌شود. دوم، سادگی: X-Frame-Options فقط سه مقدار دارد و پیکربندی آن ساده است. سوم، مکمل بودن: X-Frame-Options و CSP frame-ancestors مکمل یکدیگرند و ترکیب آن‌ها امنیت بالاتری فراهم می‌کند. چهارم، Clickjacking همچنان یک تهدید است: بر پایه گزارش OWASP، Clickjacking در لیست ده آسیب‌پذیری اصلی وب قرار دارد.

«X-Frame-Options یک هدر ساده است، اما اگر نباشد، سایت شما در معرض یکی از قدیمی‌ترین و مؤثرترین حملات وب قرار می‌گیرد.»

اگر با هدرهای امنیتی HTTP و کاربرد آن‌ها آشنا شده باشید، می‌دانید که X-Frame-Options یکی از هدرهای پایه است. اگر با امنیت وب و اصول آن آشنا شده باشید، می‌دانید که این هدر بخشی از یک استراتژی دفاع لایه‌ای است.

سناریو بدون X-Frame-Options با X-Frame-Options
Clickjacking سایت در iframe بارگذاری می‌شود مرورگر مسدود می‌کند
UI Redressing کاربر فریب می‌خورد حمله خنثی می‌شود
Likejacking کلیک ناخواسته روی Like مسدود می‌شود

حمله Clickjacking چگونه کار می‌کند؟

Clickjacking (یا UI Redressing) یک حمله است که در آن، مهاجم سایت قربانی را در یک iframe نامرئی بارگذاری می‌کند و کاربر را فریب می‌دهد تا روی عناصر مخفی کلیک کند. این حمله از چند لایه تشکیل شده است:

لایه اول: iframe نامرئی. مهاجم یک iframe با opacity: 0 یا visibility: hidden ایجاد می‌کند و سایت قربانی را در آن بارگذاری می‌نماید.

لایه دوم: طعمه بصری. مهاجم یک صفحه جذاب (مثل دکمه «جایزه بگیرید») روی iframe قرار می‌دهد.

لایه سوم: کلیک کاربر. وقتی کاربر روی دکمه طعمه کلیک می‌کند، کلیک در واقع روی دکمه مخفی در iframe (مثل «تأیید پرداخت» یا «حذف حساب») ثبت می‌شود.

<style>
    iframe {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        opacity: 0.0001;
        z-index: 2;
    }
    .decoy {
        position: absolute;
        top: 50%;
        left: 50%;
        z-index: 1;
    }
</style>

<iframe src="https://bank.example.com/transfer"></iframe>
<button class="decoy">جایزه بگیرید!</button>

اگر با حمله CSRF و روش‌های دفع آن آشنا شده باشید، می‌دانید که Clickjacking مکمل CSRF است و در برخی سناریوها خطرناک‌تر است چون نیازی به توکن CSRF ندارد.

دستورات X-Frame-Options

X-Frame-Options سه مقدار دارد که هرکدام سطح متفاوتی از محافظت را فراهم می‌کند:

مقدار اول: DENY. سایت در هیچ iframeای بارگذاری نمی‌شود، حتی از Same-Origin. این مقدار، بالاترین امنیت را فراهم می‌کند.

X-Frame-Options: DENY

مقدار دوم: SAMEORIGIN. سایت فقط در iframeهای Same-Origin بارگذاری می‌شود. این مقدار، تعادل بین امنیت و قابلیت را فراهم می‌کند.

X-Frame-Options: SAMEORIGIN

مقدار سوم: ALLOW-FROM uri. سایت فقط در iframeهای یک URI مشخص بارگذاری می‌شود. این مقدار منسوخ شده و در مرورگرهای مدرن پشتیبانی نمی‌شود. به‌جای آن، از CSP frame-ancestors استفاده کنید.

X-Frame-Options: ALLOW-FROM https://trusted.example.com

اگر با استانداردهای امنیت وب آشنا شده باشید، می‌دانید که ترکیب DENY با CSP frame-ancestors بهترین رویکرد است.

پیاده‌سازی در وردپرس

پیاده‌سازی X-Frame-Options در وردپرس در چند گام انجام می‌شود:

گام اول: افزودن هدر با header() در PHP. ساده‌ترین روش:

add_action( 'send_headers', function() {
    header( 'X-Frame-Options: SAMEORIGIN' );
} );

این کد، هدر را به تمام صفحات اضافه می‌کند. برای صفحات Admin، معمولاً نیازی به این هدر نیست.

گام دوم: افزودن هدر با Nginx. اگر سایت روی Nginx اجرا می‌شود:

add_header X-Frame-Options "SAMEORIGIN" always;

گام سوم: افزودن هدر با Apache. برای Apache:

<IfModule mod_headers.c>
    Header always set X-Frame-Options "SAMEORIGIN"
</IfModule>

گام چهارم: تست. پس از پیاده‌سازی، سایت را در یک iframe تست کنید و ببینید که مسدود می‌شود:

<iframe src="https://example.com"></iframe>

اگر با روش‌های افزایش امنیت وب‌سایت آشنا شده باشید، این گام‌ها برای شما آشناست.

تنظیمات اختصاصی وردپرس

وردپرس چند ویژگی دارد که در تنظیم X-Frame-Options باید در نظر گرفته شوند:

ویژگی اول: ویرایشگر گوتنبرگ. ویرایشگر گوتنبرگ از iframe استفاده می‌کند و اگر X-Frame-Options روی DENY تنظیم شود، ممکن است از کار بیفتد. راه‌حل: SAMEORIGIN.

ویژگی دوم: پیش‌نمایش نوشته. برخی قالب‌ها و افزونه‌ها از iframe برای پیش‌نمایش استفاده می‌کنند. راه‌حل: SAMEORIGIN.

ویژگی سوم: Embed محتوا. اگر می‌خواهید سایت شما در سایت‌های دیگر Embed شود (مثل ویدیو یا ابزار تعاملی)، X-Frame-Options باید حذف شود یا CSP frame-ancestors تنظیم گردد. راه‌حل: ALLOW-FROM منسوخ شده، از CSP استفاده کنید.

اگر با تقویت امنیت وردپرس گام‌به‌گام آشنا شده باشید، می‌دانید که این تنظیمات بخشی از سخت‌سازی است.

تعامل با CSP frame-ancestors

Content-Security-Policy (CSP) یک هدر پیشرفته‌تر است که گزینه‌های بیشتری برای کنترل iframe فراهم می‌کند. دستور frame-ancestors در CSP جایگزین X-Frame-Options است اما X-Frame-Options همچنان برای مرورگرهای قدیمی مفید است.

Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com

ترکیب X-Frame-Options و CSP بهترین رویکرد است:

X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'

اگر با روش‌های افزایش امنیت وب‌سایت آشنا شده باشید، می‌دانید که این ترکیب، امنیت بالاتری فراهم می‌کند.

تست و عیب‌یابی

تست X-Frame-Options در چند سطح انجام می‌شود:

سطح اول: Chrome DevTools. در Network → Headers، هدر را بررسی کنید.

سطح دوم: Security Headers. ابزارهایی مثل securityheaders.com می‌توانند این هدر را بررسی کنند.

سطح سوم: تست عملی. یک iframe بسازید و ببینید که سایت بارگذاری می‌شود یا خیر.

<iframe src="https://example.com" width="800" height="600"></iframe>

اگر با تست امنیت وب‌سایت آشنا شده باشید، این رویکرد برای شما آشناست.

اشتباهات رایج در پیاده‌سازی

اشتباه اول: تنظیم DENY برای سایت‌هایی که از iframe استفاده می‌کنند. اگر ویرایشگر گوتنبرگ یا پیش‌نمایش از iframe استفاده کند، DENY آن‌ها را مسدود می‌کند. راه‌حل: SAMEORIGIN.

اشتباه دوم: استفاده از ALLOW-FROM که منسوخ شده است. راه‌حل: از CSP frame-ancestors استفاده کنید.

اشتباه سوم: عدم تنظیم X-Frame-Options برای صفحات حساس. صفحات ورود، پرداخت و تنظیمات باید محافظت شوند.

اشتباه چهارم: اتکا به X-Frame-Options به‌تنهایی. این هدر مکمل CSP است، نه جایگزین.

اشتباه پنجم: عدم تست در مرورگرهای مختلف. X-Frame-Options در تمام مرورگرها پشتیبانی می‌شود اما رفتار CSP ممکن است متفاوت باشد.

اشتباه ششم: نادیده گرفتن iframeهای داخلی. اگر سایت از iframe داخلی استفاده می‌کند، باید SAMEORIGIN تنظیم شود.

اشتباه هفتم: عدم مستندسازی. اگر سیاست خاصی تعریف می‌شود، باید مستند شود.

پرسش‌های پرتکرار درباره X-Frame-Options

X-Frame-Options چیست و چرا هنوز مهم است؟

X-Frame-Options یک هدر امنیتی است که از سایت در برابر Clickjacking محافظت می‌کند. هنوز مهم است چون در مرورگرهای قدیمی پشتیبانی می‌شود، پیکربندی آن ساده است، و مکمل CSP است.

دستورات X-Frame-Options کدامند؟

سه دستور: DENY (هیچ iframe)، SAMEORIGIN (فقط Same-Origin)، ALLOW-FROM uri (منسوخ). توصیه می‌شود از SAMEORIGIN استفاده کنید و آن را با CSP frame-ancestors ترکیب نمایید.

چگونه X-Frame-Options را در وردپرس پیاده‌سازی کنم؟

از Hook send_headers و تابع header() استفاده کنید. یا از Nginx با add_header و Apache با Header always set. مثال: X-Frame-Options: SAMEORIGIN.

آیا X-Frame-Options با ویرایشگر گوتنبرگ سازگار است؟

بله، اما باید SAMEORIGIN تنظیم شود نه DENY. ویرایشگر گوتنبرگ از iframe استفاده می‌کند و DENY آن را مسدود می‌کند.

تفاوت X-Frame-Options و CSP frame-ancestors چیست؟

CSP frame-ancestors پیشرفته‌تر است و امکان تعریف چند منبع مجاز را فراهم می‌کند. X-Frame-Options ساده‌تر است و در مرورگرهای قدیمی پشتیبانی می‌شود. ترکیب این دو، بهترین رویکرد است.

آیا X-Frame-Options بر سرعت سایت تأثیر می‌گذارد؟

خیر، تأثیر منفی ندارد. این هدر فقط یک سیاست امنیتی است.

چگونه X-Frame-Options را تست کنم؟

از Chrome DevTools برای بررسی هدر، از Security Headers برای تحلیل، و از یک iframe برای تست عملی استفاده کنید.

آیا X-Frame-Options برای همه سایت‌ها ضروری است؟

بله، برای همه سایت‌ها توصیه می‌شود. حتی اگر سایت شما محتوای حساس ندارد، Clickjacking می‌تواند برای فریب کاربران استفاده شود.

آیا X-Frame-Options با WooCommerce کار می‌کند؟

بله، اما باید SAMEORIGIN تنظیم شود نه DENY. برخی درگاه‌های پرداخت از iframe استفاده می‌کنند.

آیا X-Frame-Options بر SEO تأثیر می‌گذارد؟

تأثیر مستقیمی ندارد اما بخشی از امنیت فنی است. اگر با سئو تکنیکال و اهمیت آن آشنا شده باشید، می‌دانید که امنیت یکی از سیگنال‌های رتبه‌بندی است.

تحلیل معمارانه سطح ارشد

از منظر معماری نرم‌افزار، X-Frame-Options یک نمونه از Browser-Level Security Enforcement است: به‌جای اعتماد به کد اپلیکیشن، مرورگر یک سیاست امنیتی را اجرا می‌کند. این رویکرد، در معماری‌های مدرن به یک اصل تبدیل شده: از Defense in Depth تا Zero-Trust.

چالش اصلی، Backward Compatibility است: این هدر در مرورگرهای قدیمی پشتیبانی می‌شود اما CSP در آن‌ها پشتیبانی نمی‌شود. راه‌حل، ترکیب هر دو.

چالش دوم، Ecosystem Compatibility است: اگر سایت از iframeهای خارجی استفاده می‌کند، تنظیم X-Frame-Options می‌تواند آن‌ها را مسدود کند. راه‌حل، تنظیم دقیق بر پایه نیازها.

چالش سوم، Observability است: اگر X-Frame-Options iframeای را مسدود کند، چگونه می‌توان فهمید؟ مرورگر خطا را در Console ثبت می‌کند اما این خطا به Backend نمی‌رسد. راه‌حل، استفاده از Reporting API.

در نهایت، X-Frame-Options یک Evolution است، نه یک Revolution. این هدر، تکامل طبیعی معماری امنیتی وب است: از کنترل متمرکز به کنترل توزیع‌شده، از اعتماد کامل به iframeها به تأیید هر Embed. تیم‌هایی که این رویکرد را در فرهنگ خود نهادینه می‌کنند، سیستم‌هایی می‌سازند که در برابر طیف گسترده‌ای از حملات مقاوم هستند. اگر با طراحی معماری وب مقیاس‌پذیر آشنا شده باشید، این رویکرد را به‌عنوان یک اصل مهندسی می‌شناسید.

اگر این تجربه را در یک پروژه واقعی داشته‌اید، جالب است بدانید کدام دستور X-Frame-Options بیشترین تأثیر را در افزایش امنیت داشت. تجربه خودتان را در دیدگاه‌ها بنویسید؛ به‌خصوص اگر راه‌حل دیگری پیدا کرده‌اید که می‌تواند برای خواننده بعدی مفید باشد. 🛡️