یک هدر امنیتی فقط وقتی مفید است که در پاسخ درست، با مقدار درست و بدون نسخهٔ تکراری ارسال شود. امشب سیاست پایه را برای سایت ثابت می‌گذاریم و پاسخ‌های 200 و 404 را بررسی می‌کنیم.

این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نام‌ها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.

محیط: VirtualHost HTTPS سایت www، ماژول headers؛ HSTS شب چهاردهم فعال است.

نقش هدرها#

X-Content-Type-Options: nosniff حدس نوع محتوا را محدود می‌کند؛ Referrer-Policy میزان اطلاعات نشانی قبلی را کنترل می‌کند؛ Permissions-Policy استفاده از برخی قابلیت‌های مرورگر را محدود می‌کند. این‌ها جای اعتبارسنجی ورودی یا رفع XSS در برنامه را نمی‌گیرند.

داخل میزبان HTTPS اضافه کن:

Header onsuccess unset X-Content-Type-Options
Header always set X-Content-Type-Options "nosniff"
Header onsuccess unset Referrer-Policy
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header onsuccess unset Permissions-Policy
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"

Apache برای برخی پاسخ‌ها، از جمله خروجی CGI و proxy، جدول هدر متفاوت دارد. ترکیب onsuccess unset و always set برای جلوگیری از دو مقدار متعارض است؛ وقتی backend هدر را تولید می‌کند، مالک نهایی policy را روشن کن. قابلیت دوربین یا مکان‌یابی موردنیاز برنامه را بدون تحلیل مسدود نکن.

مشاهدهٔ پاسخ واقعی#

curl --cacert ~/apache-lab/pki/ca.crt \
  --resolve www.example.test:443:192.168.56.10 \
  -sS -D - -o /dev/null https://www.example.test/
curl --cacert ~/apache-lab/pki/ca.crt \
  --resolve www.example.test:443:192.168.56.10 \
  -sS -D - -o /dev/null https://www.example.test/missing

در هر دو پاسخ هر هدر باید یک مقدار موردنظر داشته باشد. برای مشاهدهٔ رفتار مرورگر DevTools را هم ببین؛ HEAD همیشه تمام رفتار GET و برنامه را نمایندگی نمی‌کند، به همین دلیل اینجا GET با حذف بدنه می‌فرستیم.

تمرین و بازگشت: هدر را عمداً در backend و Apache با دو مقدار متفاوت تولید کن و سپس فقط یک منبع را نگه دار. policy ناسازگار را از config حذف و reload کن؛ cache مرورگر را در تشخیص اثر دخیل بدان.

منبع: جدول‌های هدر در mod_headers ، هدرهای امنیتی OWASP .