
وقتی درباره امنیت وردپرس صحبت میکنیم، معمولاً اولین چیزهایی که به ذهن میرسد افزونه امنیتی، رمز عبور قوی، SSL و بروزرسانی منظم است. اما یک بخش مهم دیگر هم وجود دارد که کمتر درباره آن صحبت میشود هدرهای امنیتی یا Security Headers است.
اگر بخواهیم خیلی ساده توضیح بدهیم، هدرهای امنیتی چند دستور هستند که سرور برای مرورگر میفرستد. این دستورها به مرورگر میگویند چه کارهایی مجاز است و چه کارهایی نباید انجام شود. مثلاً مرورگر فقط از اتصال امن HTTPS استفاده کند، اجازه ندهد صفحه شما داخل سایت دیگری نمایش داده شود یا بعضی اسکریپتهای ناشناس را اجرا نکند.
در این مقاله قرار نیست وارد بحثهای پیچیده سرور و برنامهنویسی شویم. هدف این است که بفهمیم هر هدر امنیتی چه کاری انجام میدهد، کدام موارد برای سایت وردپرسی مهمتر هستند و چطور بدون خراب کردن سایت آنها را فعال کنیم.
هدر امنیتی چیست؟
وقتی کاربر یک صفحه از سایت شما را باز میکند، مرورگر از سرور درخواست میفرستد و سرور هم پاسخ میدهد. این پاسخ فقط شامل متن و تصویر صفحه نیست. قبل از محتوای اصلی، بخشی به نام Header وجود دارد که اطلاعات و دستورهای مختلفی را به مرورگر میدهد.
Security Header یا هدر امنیتی در واقع یکی از همین دستورهاست. برای مثال یک هدر میتواند بگوید «این سایت فقط باید با HTTPS باز شود» و هدر دیگری میتواند بگوید «فقط اسکریپتهایی که از منابع مشخص آمدهاند اجازه اجرا دارند».

هدرهای امنیتی چه کمکی به وردپرس میکنند؟
هدرهای امنیتی معمولاً یک مشکل امنیتی را از ریشه حل نمیکنند، اما کار مهاجم را سختتر میکنند. مثلاً اگر در سایت یک مشکل XSS وجود داشته باشد، راهحل اصلی اصلاح کد است؛ اما CSP میتواند اجرای بعضی اسکریپتهای تزریقشده را محدود کند.
- کاهش خطر اجرای اسکریپتهای مخرب یا XSS
- کاهش خطر Clickjacking؛ یعنی نمایش سایت شما داخل یک صفحه جعلی
- جلوگیری از بعضی رفتارهای اشتباه مرورگر در تشخیص نوع فایل
- کم کردن اطلاعاتی که هنگام رفتن کاربر از یک سایت به سایت دیگر ارسال میشود
- محدود کردن دسترسی سایت به دوربین، میکروفن یا موقعیت مکانی
- اجبار مرورگر به استفاده از HTTPS
مهمترین هدرهای امنیتی وردپرس
| هدر | کار اصلی | برای چه کسی مهم است؟ |
|---|---|---|
| CSP | کنترل اسکریپتها، فونتها، تصاویر و منابع خارجی | سایتهایی که سرویسهای خارجی زیادی دارند |
| HSTS | اجبار استفاده از HTTPS | سایتهایی که HTTPS کاملاً پایدار دارند |
| X-Content-Type-Options | جلوگیری از حدس زدن نوع فایل توسط مرورگر | تقریباً همه سایتها |
| Referrer-Policy | کنترل اطلاعاتی که هنگام خروج کاربر ارسال میشود | تقریباً همه سایتها |
| Permissions-Policy | محدود کردن دوربین، میکروفن و موقعیت مکانی | سایتهایی که این قابلیتها را استفاده نمیکنند |
| X-Frame-Options | کاهش خطر Clickjacking | بیشتر سایتها |
CSP چیست؟
CSP مخفف Content Security Policy است. این هدر مشخص میکند مرورگر اجازه دارد فایلها و منابع سایت را از کجا بارگذاری کند. به زبان ساده، شما یک فهرست از منابع مجاز میسازید.
برای مثال اگر سایت شما فقط از فایلهای خودش استفاده کند، CSP میتواند جلوی اجرای اسکریپتی را بگیرد که از یک دامنه ناشناس وارد شده است. اما در وردپرس معمولاً داستان کمی پیچیدهتر است، چون قالب، افزونهها، فونتها، درگاه پرداخت، گوگل آنالیتیکس، چت آنلاین یا سرویسهای دیگری هم ممکن است منابع خارجی داشته باشند.
Content-Security-Policy: default-src 'self';
این نمونه یعنی بهطور پیشفرض منابع از خود سایت بارگذاری شوند. اما همین خط ساده ممکن است روی یک سایت واقعی باعث از کار افتادن بعضی امکانات شود، بنابراین نباید آن را بدون تست روی سایت اصلی قرار دهید.
بهترین روش برای شروع CSP
اگر سایت فعال دارید، بهتر است CSP را ابتدا در حالت Report-Only اجرا کنید. در این حالت مرورگر فقط گزارش میدهد چه چیزی با سیاست شما سازگار نیست، اما چیزی را مسدود نمیکند.
Content-Security-Policy-Report-Only: default-src 'self';
بعد از بررسی خطاها میتوانید دامنهها و منابع واقعی سایت را به سیاست اضافه کنید و وقتی مطمئن شدید همه چیز درست کار میکند، حالت اصلی CSP را فعال کنید.
CSP چه چیزهایی را کنترل میکند؟
- اسکریپتهای جاوااسکریپت
- فایلهای CSS
- تصاویر
- فونتها
- iframeها مثل ویدئو یا نقشه
- ارتباط با APIها و سرویسهای خارجی
- مقصد ارسال بعضی فرمها
چرا نباید CSP آماده اینترنت را کپی کنیم؟
چون منابع هر سایت متفاوت است. یک سایت ممکن است از فونت گوگل استفاده کند، سایت دیگری درگاه پرداخت داشته باشد و سایت سوم از چت آنلاین یا Tag Manager استفاده کند. اگر سیاست سایت دیگری را کپی کنید، ممکن است بخشی از سایت شما مسدود شود.
HSTS چیست؟
HSTS مخفف HTTP Strict Transport Security است. این هدر به مرورگر میگوید سایت شما فقط باید با HTTPS باز شود.
Strict-Transport-Security: max-age=31536000
بعد از اینکه مرورگر این هدر را دریافت کرد، در بازدیدهای بعدی تلاش میکند کاربر را مستقیماً به نسخه HTTPS ببرد. این کار خطر استفاده ناخواسته از اتصال ناامن HTTP را کاهش میدهد.
includeSubDomains چیست؟
اگر includeSubDomains را فعال کنید، HSTS روی زیردامنهها هم اعمال میشود. قبل از فعال کردن آن باید مطمئن شوید همه زیردامنههای مهم سایت HTTPS سالم دارند.
آیا HSTS Preload لازم است؟
برای بیشتر سایتها ضروری نیست. Preload یک تنظیم جدی و بلندمدت است و بهتر است فقط زمانی استفاده شود که کاملاً مطمئن هستید دامنه و همه زیردامنهها همیشه با HTTPS کار خواهند کرد.
X-Content-Type-Options چیست؟
این هدر یکی از سادهترین گزینههای امنیتی است و معمولاً دردسر کمی دارد.
X-Content-Type-Options: nosniff
مرورگر گاهی سعی میکند خودش حدس بزند یک فایل چه نوعی است. مقدار nosniff به مرورگر میگوید به نوع فایلی که سرور اعلام کرده اعتماد کند و خودش حدس نزند.
Referrer-Policy چیست؟
وقتی کاربر از سایت شما روی یک لینک خارجی کلیک میکند، ممکن است مرورگر بخشی از آدرس صفحه قبلی را برای سایت مقصد ارسال کند. Referrer-Policy مشخص میکند چه مقدار از این اطلاعات ارسال شود.
Referrer-Policy: strict-origin-when-cross-origin
این مقدار برای بسیاری از سایتها انتخاب متعادلی است؛ چون در رفتن به سایت دیگر معمولاً فقط نام دامنه را ارسال میکند و مسیر کامل صفحه را نمیفرستد.
Permissions-Policy چیست؟
بعضی سایتها به قابلیتهایی مثل دوربین، میکروفن یا موقعیت مکانی نیاز ندارند. Permissions-Policy به شما اجازه میدهد این دسترسیها را محدود کنید.
Permissions-Policy: camera=(), microphone=(), geolocation=()
اگر سایت شما واقعاً به موقعیت مکانی یا دوربین نیاز دارد، همین نمونه را کپی نکنید. فقط قابلیتهایی را ببندید که مطمئن هستید استفاده نمیشوند.
X-Frame-Options چیست؟
این هدر کمک میکند سایت شما بدون اجازه داخل iframe سایت دیگری نمایش داده نشود. این کار خطر Clickjacking را کمتر میکند.
X-Frame-Options: SAMEORIGIN
SAMEORIGIN یعنی صفحه فقط داخل سایت خودتان اجازه نمایش در iframe دارد. اگر سایت شما عمداً باید داخل سرویس دیگری نمایش داده شود، قبل از فعال کردن این مقدار حتماً تست کنید.
COOP، COEP و CORP؛ آیا برای همه لازماند؟
خیر. این سه هدر بیشتر برای پروژههای پیشرفته وب و کنترل ارتباط بین سایتها و منابع مختلف استفاده میشوند. برای بیشتر سایتهای عادی وردپرسی لازم نیست از همان ابتدا سراغ آنها بروید.
اگر توسعهدهنده نیستید و نیاز مشخصی ندارید، بهتر است این بخش را به تنظیمات تخصصی سایت بسپارید؛ چون اشتباه در آنها میتواند فونت، تصویر، پنجره پرداخت یا سرویسهای خارجی را از کار بیندازد.
Cookieهای Secure، HttpOnly و SameSite
کوکیها هم نقش مهمی در امنیت ورود کاربران دارند. سه ویژگی مهم عبارتاند از:
- Secure: کوکی فقط روی HTTPS ارسال میشود.
- HttpOnly: جاوااسکریپت صفحه نمیتواند بهسادگی کوکی را بخواند.
- SameSite: مشخص میکند کوکی در درخواستهایی که از سایت دیگر میآیند چگونه رفتار کند.
وردپرس بخش زیادی از کوکیهای ورود را خودش مدیریت میکند. بنابراین بهتر است بدون شناخت کافی یک تنظیم عمومی برای همه Cookieها اضافه نکنید.
کدام هدرهای قدیمی را بهتر است استفاده نکنیم؟
X-XSS-Protection
این هدر مربوط به مرورگرهای قدیمی است و امروز دیگر راهحل اصلی مقابله با XSS محسوب نمیشود. در سایتهای جدید بهتر است روی CSP درست و کدنویسی امن تمرکز کنید.
Expect-CT
این هدر هم مربوط به سازوکار قدیمی Certificate Transparency است و در تنظیمات جدید معمولاً نیازی به آن نیست.
Feature-Policy
Feature-Policy نام قدیمی Permissions-Policy است. اگر در آموزشهای قدیمی این نام را دیدید، بدانید که ساختار جدید تغییر کرده است.
چطور بفهمیم سایت الان چه هدرهایی دارد؟
روش 1: مرورگر کروم
- سایت را در Chrome باز کنید.
- Developer Tools را باز کنید.
- به تب Network بروید.
- صفحه را Refresh کنید.
- درخواست اصلی صفحه را انتخاب کنید.
- در بخش Response Headers دنبال نام هدرهای امنیتی بگردید.
روش 2: دستور curl
curl -I https://example.com
این دستور هدرهای پاسخ سایت را نمایش میدهد. اگر سایت ریدایرکت دارد میتوانید از دستور زیر استفاده کنید:
curl -sI -L https://example.com
هدرهای امنیتی را کجا تنظیم کنیم؟
| محل تنظیم | مزیت | برای چه کسی مناسب است؟ |
|---|---|---|
| Apache / Nginx | کنترل مستقیم و مرکزی | مدیر سرور یا کاربر حرفهای |
| CDN مثل Cloudflare | مدیریت سادهتر روی پاسخ نهایی | سایتهایی که CDN دارند |
| وردپرس / PHP | امکان شرطگذاری داخل سایت | توسعهدهندگان وردپرس |
| افزونه امنیتی | رابط کاربری ساده | کاربران غیرتخصصی |
اگر کاربر عمومی هستید، افزونه امنیتی یا تنظیمات CDN معمولاً سادهتر است. اگر به سرور دسترسی دارید، Apache یا Nginx کنترل بیشتری میدهد.
نمونه ساده برای Apache
اگر سایت روی Apache است و mod_headers فعال باشد، این دو هدر برای شروع معمولاً سادهتر هستند:
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
قبل از تغییر فایل .htaccess حتماً بکاپ بگیرید. یک اشتباه کوچک در این فایل ممکن است باعث خطای 500 شود.
نمونه ساده برای Nginx
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
بعد از تغییر تنظیمات Nginx باید فایل تنظیمات از نظر خطا بررسی و سرویس Reload شود. اگر به سرور دسترسی ندارید، از پشتیبانی هاست کمک بگیرید.
آیا میشود هدرها را از داخل وردپرس اضافه کرد؟
بله. وردپرس فیلتر wp_headers را برای تغییر هدرهای خروجی دارد. یک نمونه ساده:
add_filter( 'wp_headers', function( $headers ) {
$headers['X-Content-Type-Options'] = 'nosniff';
$headers['Referrer-Policy'] = 'strict-origin-when-cross-origin';
return $headers;
} );
اما اگر سایت از کش صفحه یا CDN استفاده کند، ممکن است پاسخ نهایی قبل از اجرای PHP آماده شود. به همین دلیل برای هدرهای سراسری، تنظیم در سرور یا CDN معمولاً قابل اتکاتر است.
برای بیشتر سایتها از کجا شروع کنیم؟
اگر تازه با هدرهای امنیتی آشنا شدهاید، لازم نیست همه چیز را یکجا فعال کنید. مسیر سادهتر این است:
- اول وضعیت فعلی سایت را بررسی کنید.
- X-Content-Type-Options و Referrer-Policy را تست کنید.
- اگر HTTPS کاملاً سالم است، HSTS را با احتیاط بررسی کنید.
- CSP را ابتدا در حالت Report-Only اجرا کنید.
- بعد از هر تغییر، ورود، فرمها، تصاویر، فونتها و صفحات اصلی را تست کنید.
- در سایت فروشگاهی حتماً سبد خرید، تسویهحساب و درگاه پرداخت را هم تست کنید.
بعد از فعال کردن هدرها چه چیزهایی را تست کنیم؟
- صفحه اصلی و چند صفحه داخلی
- ورود و بازیابی رمز عبور
- فرم تماس و ثبتنام
- جستجوی سایت
- نمایش ویدئو، نقشه و iframe
- فونتها و ظاهر موبایل
- در ووکامرس: محصول، سبد خرید، تسویهحساب و درگاه پرداخت
- گوگل آنالیتیکس، Tag Manager و ابزارهای جانبی
- صفحات کششده و حالت کاربر مهمان
هدرهای امنیتی یکی از لایههای مفید برای امنتر کردن سایت وردپرسی هستند، اما لازم نیست از همان ابتدا وارد تنظیمات پیچیده شوید. برای بیشتر سایتها، شروع با X-Content-Type-Options و Referrer-Policy سادهتر است. HSTS را فقط وقتی فعال کنید که HTTPS کاملاً پایدار باشد و CSP را هم مرحلهبهمرحله و ابتدا در حالت Report-Only آزمایش کنید.
مهمترین نکته این است که هیچ تنظیمی را فقط برای گرفتن امتیاز بهتر از ابزارهای اسکن کپی نکنید. هر تغییر باید با ساختار واقعی سایت، افزونهها، فرمها، فونتها، درگاه پرداخت و سرویسهای خارجی هماهنگ باشد. اگر مطمئن نیستید، تنظیمات حساس مثل CSP و HSTS را ابتدا روی محیط آزمایشی انجام دهید.
اشتباهات رایج
کپی کردن تنظیم آماده از اینترنت
هر سایت منابع و افزونههای متفاوتی دارد. مخصوصاً CSP و HSTS را نباید بدون بررسی روی سایت اصلی قرار دهید.
فعال کردن CSP سختگیرانه از همان ابتدا
ممکن است جاوااسکریپت، فونت، فرم یا حتی درگاه پرداخت از کار بیفتد. اول Report-Only را امتحان کنید.
فعال کردن HSTS قبل از آماده بودن HTTPS
اگر SSL یا زیردامنهها مشکل داشته باشند، ممکن است بخشی از سایت برای کاربران باز نشود.
تنظیم یک هدر در چند جا
اگر هاست، CDN و افزونه هرکدام یک نسخه متفاوت از هدر را ارسال کنند، پیدا کردن مشکل سخت میشود. بهتر است بدانید هر هدر دقیقاً از کجا ارسال میشود.
آیا هدرهای امنیتی روی سئو اثر دارند؟
هدرهای امنیتی بهطور مستقیم یک ترفند سئو نیستند. هدف اصلی آنها افزایش امنیت و کنترل رفتار مرورگر است.
اما اگر تنظیم اشتباه باعث شود CSS، جاوااسکریپت، تصاویر یا بخشهای مهم صفحه بارگذاری نشوند، تجربه کاربر و عملکرد سایت آسیب میبیند. بنابراین تنظیم درست آنها بهصورت غیرمستقیم اهمیت دارد.
آیا افزونه امنیتی یا WAF جای هدرهای امنیتی را میگیرد؟
خیر. هرکدام کار متفاوتی انجام میدهند. WAF درخواستهای مشکوک را بررسی میکند، افزونه امنیتی روی خود وردپرس کنترل دارد و Security Headers به مرورگر میگویند صفحه را چطور پردازش کند.


