Rudra Analyzer

الأمان

ما هي ترويسات الأمان؟ وظيفة كل ترويسة وطريقة إضافتها

ترويسات الأمان تفعّل وسائل حماية مدمجة في كل متصفح. وظيفة كل ترويسة، وقيم آمنة للبداية، وطريقة إضافتها على الخوادم والمنصات الشائعة.

بقلم Rudra Techno Team 9 دقائق للقراءة
في هذه الصفحة

ترويسات الأمان ترويسات في استجابة HTTP تطلب من المتصفح تفعيل وسائل حماية مدمجة فيه أصلًا: ألّا يتصل إلا عبر HTTPS، وأن يرفض تشغيل سكربتات من مصادر غير متوقعة، وألّا يسمح لمواقع أخرى بعرض هذه الصفحة داخل إطار، وهكذا. وهي لا تصلح الشيفرة المصابة بالثغرات، لكنها تجعل عددًا من الهجمات الشائعة، مثل البرمجة عبر المواقع (XSS) واختطاف النقرات وتخفيض البروتوكول، أصعب تنفيذًا بكثير أو أقل ضررًا إن وقعت.

كيف تعرف الترويسات التي يرسلها موقعك

  • في المتصفح: افتح أدوات المطوّر، وانتقل إلى تبويب Network، وأعد تحميل الصفحة، ثم انقر أول طلب (طلب المستند) وانظر إلى Response Headers.
  • من الطرفية: الأمر curl -I https://example.com يطبع الترويسات.
  • بأداة فحص: فاحص أمان المواقع المجاني من Rudra يتحقق من أن الموقع يستخدم HTTPS ويعيد توجيه HTTP العادي إليه، ومن أن شهادة TLS صالحة ولا توشك أن تنتهي، ويقرأ قيم HSTS و Content-Security-Policy و X-Frame-Options (أو توجيه frame-ancestors في CSP) و X-Content-Type-Options و Referrer-Policy و Permissions-Policy. وينبّه كذلك إلى ترويسات Server أو X-Powered-By التي تكشف أرقام إصدارات البرمجيات، ويفحص خصائص ملفات تعريف الارتباط وإعدادات CORS.

مجرد وجود الترويسة ليس حكمًا نهائيًا. فترويسة Content-Security-Policy التي تسمح بالسكربتات من أي مكان موجودة لكنها لا تحمي إلا قليلًا، ولهذا يحلل Rudra القيم أيضًا: قيمة max-age في HSTS تقل عن 180 يومًا، أو CSP فيها 'unsafe-inline' أو علامة * ضمن script-src، أو قيمة غير صالحة في X-Frame-Options، كلها تُصنَّف ضعيفة. اقرأ الأقسام التالية لتحكم على قيمك أنت.

الترويسات، واحدة تلو الأخرى

Strict-Transport-Security (HSTS)

تطلب من المتصفح استخدام HTTPS مع نطاقك لمدة محددة، حتى لو كتب أحدهم http:// أو اتبع رابطًا قديمًا. وهذا يسدّ الثغرة الزمنية التي يستطيع فيها مهاجم على الشبكة اعتراض أول طلب غير آمن. ومن القيم الشائعة Strict-Transport-Security: max-age=63072000; includeSubDomains (سنتان).

  • ابدأ بقيمة max-age قصيرة، مثل 300 ثانية، وارفعها حين تتيقن من أن كل صفحة تعمل عبر HTTPS.
  • لا تضف includeSubDomains إلا إذا كانت كل النطاقات الفرعية تعمل عبر HTTPS، ومنها القديمة التي ربما نسيتها.
  • خاصية preload، مع تسجيل النطاق في قائمة التحميل المسبق لدى المتصفحات، تثبّت HTTPS لنطاقك داخل المتصفحات نفسها. والتراجع عنها صعب وبطيء، فأضفها آخرًا وعن قصد.
  • لا تلتزم المتصفحات بترويسة HSTS إلا إذا وصلتها عبر HTTPS.

Content-Security-Policy (CSP)

قائمة بالمصادر التي يجوز للصفحة أن تحمّل منها السكربتات والأنماط والصور والخطوط والإطارات. فإن نجح مهاجم في حقن سكربت، منعت CSP الجيدة المتصفح من تشغيله. وهي أقوى الترويسات هنا وأسهلها وقوعًا في الخطأ. وهذه نقطة بداية معقولة لموقع بسيط:

Content-Security-Policy: default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; frame-ancestors 'none'

تسمح هذه السياسة بالموارد من أصل موقعك وحده (مع الصور المضمّنة بصيغة data:)، وتحظر الإضافات (plugins)، وتمنع وسوم <base> المحقونة من تحويل وجهة الروابط النسبية، وتمنع عرض الصفحة داخل إطار. المواقع الحقيقية تستخدم أدوات تحليلات وخطوطًا ومحتوى مضمّنًا ومزوّدي دفع، وكلٌّ منها يجب السماح به صراحةً، والسكربتات المضمّنة تُحظر ما لم تسمح بها عبر nonce أو hash. ابدأ تطبيقها بترويسة Content-Security-Policy-Report-Only: يبلّغ المتصفح عن المخالفات في الكونسول (وإلى نقطة استقبال التقارير إن حددت واحدة) دون أن يحظر شيئًا، فتعدّل السياسة قبل فرضها.

X-Content-Type-Options

الترويسة X-Content-Type-Options: nosniff تمنع المتصفحات من تخمين نوع الملف، كأن تشغّل ملفًا نصيًا مرفوعًا على أنه سكربت. لا إعدادات لها، وقلّما تعطّل شيئًا ما دام خادمك يرسل ترويسات Content-Type صحيحة. أضفها في كل مكان.

الحماية من اختطاف النقرات: frame-ancestors و X-Frame-Options

اختطاف النقرات يخدع الناس ليضغطوا على شيء في موقعك وهو مخفي داخل إطار في موقع آخر. والوسيلة الحديثة لمنعه هي توجيه CSP بقيمة frame-ancestors 'none' (لا تسمح بالتأطير أبدًا) أو frame-ancestors 'self' (صفحاتك أنت فقط). أما الترويسة الأقدم X-Frame-Options: DENY أو SAMEORIGIN فتؤدي المهمة نفسها في المتصفحات القديمة، وإرسال الاثنتين معًا لا ضرر فيه. وإن كان لا بد من تضمين صفحاتك في مواقع شركاء بعينهم، فأدرج أصول تلك المواقع في frame-ancestors.

Referrer-Policy

تتحكم في مقدار ما يُرسَل من عنوان URL الحالي إلى المواقع الأخرى حين يتبع الزوار رابطًا أو تُحمَّل موارد. فالعناوين قد تحتوي على كلمات بحث أو معرّفات أو رموز وصول لا تريد تسريبها. القيمة Referrer-Policy: strict-origin-when-cross-origin ترسل العنوان كاملًا داخل موقعك، وترسل الأصل فقط (https://example.com) إلى المواقع الأخرى، ولا ترسل شيئًا عند الانتقال من HTTPS إلى HTTP. والمتصفحات الحديثة تعتمدها أصلًا قيمة افتراضية؛ وضبطها صراحةً يجعل السلوك متسقًا.

Permissions-Policy

تعطّل ميزات المتصفح القوية التي لا يستخدمها موقعك، فلا تستطيع شيفرتك ولا أي طرف ثالث مضمّن أن يطلبها. لموقع لا يحتاج إلى الكاميرا أو الميكروفون أو الموقع الجغرافي: Permissions-Policy: camera=(), microphone=(), geolocation=().

ترويسات ينبغي حذفها أو تجاوزها

  • الترويسات الكاشفة للإصدار. قيم Server و X-Powered-By التي تحمل أرقام إصدارات تخبر المهاجمين بالبرنامج والإصدار اللذين يستهدفونهما بالضبط. احذفها أو أزل رقم الإصدار منها (في nginx عبر server_tokens off;).
  • X-XSS-Protection كانت تتحكم في فلتر أزالته المتصفحات الحديثة. لا تعتمد عليها؛ احذفها أو اضبطها على 0.

كيف تضيف ترويسات الأمان

nginx

  • add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
  • add_header X-Content-Type-Options "nosniff" always;
  • add_header Referrer-Policy "strict-origin-when-cross-origin" always;
  • add_header X-Frame-Options "DENY" always;

الخاصية always تضيف الترويسة إلى استجابات الأخطاء أيضًا. وانتبه للوراثة: إذا احتوى قسم location على أي توجيه add_header، توقف عن وراثة الترويسات المعرّفة على مستوى server، فتختفي بصمت من تلك العناوين. كرّرها هناك، أو ضعها في ملف مشترك تستدعيه عبر include.

Apache

بعد تفعيل mod_headers، أضف في إعدادات المضيف الافتراضي أو في .htaccess السطر Header always set X-Content-Type-Options "nosniff"، واتبع النمط نفسه مع كل ترويسة، مثل Header always set Referrer-Policy "strict-origin-when-cross-origin".

Next.js

في next.config.js، أعد الترويسات لكل المسارات: async headers() { return [{ source: '/:path*', headers: [{ key: 'X-Content-Type-Options', value: 'nosniff' }, { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' }] }]; }. أما CSP التي تستخدم nonce، فولّد ترويستها مع كل طلب في middleware، كما توضح وثائق Next.js.

Netlify و Cloudflare Pages وما شابههما من منصات الاستضافة

تقرأ هذه المنصات ملف _headers في مجلد النشر. اكتب نمط المسار في سطر، مثل /*، ثم كل ترويسة في سطر مستقل مُزاح تحته، مثل X-Content-Type-Options: nosniff. وفي Vercel يقابل ذلك قسم headers في ملف vercel.json. وإن كنت تستخدم شبكة CDN، فهي تستطيع في الغالب إضافة الترويسات أيضًا.

طبّقها بأمان

  1. أضف أولًا الترويسات قليلة المخاطر: X-Content-Type-Options و Referrer-Policy و Permissions-Policy والحماية من اختطاف النقرات.
  2. فعّل HSTS بقيمة max-age قصيرة، ثم زدها على مدى أسابيع.
  3. انشر CSP في وضع التقرير فقط، وأصلح ما تبلّغ عنه، ثم افرضها.
  4. اختبر المسارات التي تشارك فيها أطراف ثالثة: تسجيل الدخول، وإتمام الشراء وإطارات الدفع، والفيديوهات المضمّنة، والخرائط، وأدوات المحادثة، والتحليلات.
  5. أعد الفحص بفاحص الأمان، وكرّره كلما أضفت أداة جديدة من طرف ثالث.

أخطاء شائعة

  • نسخ CSP صارمة من موقع آخر فتتعطل المدفوعات أو التحليلات أو المحتوى المضمّن.
  • كتابة CSP مليئة بقيم 'unsafe-inline' و 'unsafe-eval' وأحرف البدل، فتجتاز فحص الوجود لكنها لا تحمي إلا قليلًا.
  • إضافة preload إلى HSTS قبل أن يصبح كل نطاق فرعي جاهزًا لـ HTTPS.
  • ضبط الترويسات في وسم <meta> داخل HTML. بعض توجيهات CSP فقط تعمل بهذه الطريقة؛ أما HSTS و frame-ancestors و X-Frame-Options فتُتجاهَل في وسوم meta.
  • إضافة الترويسات في التطبيق وفي الخادم الوسيط معًا، فتحمل الاستجابات قيمًا مكررة أو متعارضة.
  • اعتبار الترويسات بديلًا من تحديث البرمجيات والتحقق من المدخلات وتهريب المخرجات.

ما لا تغطيه الترويسات ولا فحوصها

الترويسات طبقة حماية واحدة. وفحص الترويسات لن يكشف إضافة قديمة، ولا كلمة مرور ضعيفة للوحة الإدارة، ولا ثغرة حقن، ولا ملف نسخة احتياطية مكشوفًا. وملفات تعريف الارتباط تستحق مراجعة خاصة بها أيضًا: ينبغي أن تحمل ملفات الجلسة سمات Secure و HttpOnly و SameSite. ويذكر فاحص الأمان في Rudra هذه الخصائص لملفات تعريف الارتباط التي تضبطها استجابة الصفحة نفسها (بالاسم، لا بالقيمة أبدًا)؛ راجع كيفية فحص أمان ملفات تعريف الارتباط للتفاصيل، وكيفية فحص أمان الموقع لمعرفة ما يستطيع الفحص غير التدخلي أن يخبرك به وما لا يستطيع. ولنظرة أشمل إلى سلامة موقعك، أجرِ تدقيقًا كاملًا للموقع.

الأسئلة الشائعة

أي ترويسة أمان أضيفها أولًا؟

تأكد أولًا من أن الموقع كله يعمل عبر HTTPS، ثم أضف X-Content-Type-Options: nosniff وترويسة Referrer-Policy والحماية من اختطاف النقرات، فهي قلّما تعطّل شيئًا. بعدها أضف HSTS بقيمة max-age قصيرة، واترك Content-Security-Policy للنهاية، في وضع التقرير فقط أولًا.

هل تؤثر ترويسات الأمان في SEO؟

ليس مباشرة. HTTPS نفسه إشارة ترتيب خفيفة لدى Google، لكن ترويسات مثل CSP أو X-Content-Type-Options لا تؤثر في الترتيب. هي تحمي زوارك وسمعة موقعك، وهذا أهم.

هل صارت X-Frame-Options متقادمة؟

حلّ محلها توجيه frame-ancestors في CSP، وهو أكثر مرونة. وإرسال الاثنتين معًا لا يضر، ويغطي المتصفحات القديمة.

هل أستطيع ضبط ترويسات الأمان بوسم meta؟

جزئيًا فقط. يمكن ضبط Content-Security-Policy في وسم meta، لكن دون frame-ancestors ودون التقارير. أما HSTS و X-Frame-Options ومعظم ترويسات الأمان الأخرى فلا تعمل إلا ترويسات حقيقية في استجابة HTTP.

هل ستعطّل Content-Security-Policy الصارمة موقعي؟

قد تفعل، إن حظرت سكربتات أو أنماطًا أو إطارات تحتاج إليها صفحاتك. ولهذا عليك أن تبدأ بترويسة Content-Security-Policy-Report-Only، وتراجع المخالفات المبلَّغ عنها، وتعدّل السياسة، ثم تفرضها بعد ذلك فقط.

هل تحتاج إلى تحليل أعمق لموقعك؟

اطّلع على كل مشكلة في موقعك مرتبةً حسب أولوية الإصلاح

افحص أي صفحة مجانًا ودون حساب، أو سجّل للزحف إلى موقعك كاملًا. يغطي كل تقرير تحسين محركات البحث ومشكلات الأداء الشائعة وإمكانية الوصول والأمان، مع إصلاح مقترح لكل مشكلة.