الفرق بين المراجعتين ل"Next.js/security headers"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (مراجعة)
سطر 23: سطر 23:
 
إليك بعض الترويسات التي يمكنك إضافتها إلى تطبيقك:
 
إليك بعض الترويسات التي يمكنك إضافتها إلى تطبيقك:
  
=== الترويسة X-DNS-Prefetch-Control ===
+
=== X-DNS-Prefetch-Control ===
تتحكم هذه الترويسة بالإحضار المسبق لبيانات خادم [https://academy.hsoub.com/devops/networking/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r573/ DNS] مما يتيح للمتصفح تحديد أسماء النطاقات للروابط الخارجية مسبقًا مثل ملفات التنسيقات المورَّثة CSS وملفات JavaScript وغيرها. تُنفَّذ هذه العملية خلف الستار، وهكذا يُرجح أن تكون أسماء النطاقات DNS جاهزة في الوقت الذي يطلب فيه التطبيق هذه العناصر، ويقلل ذلك التأخير الحاصل عند طلب الرابط.<syntaxhighlight lang="javascript">
+
تتحكم هذه الترويسة بالإحضار المسبق لبيانات خادم [https://academy.hsoub.com/devops/networking/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r573/ DNS] مما يتيح للمتصفح تحديد أسماء النطاقات للروابط الخارجية مسبقًا مثل ملفات [[CSS]] وملفات [[JavaScript]] وغيرها. تُنفَّذ هذه العملية خلف الستار، وهكذا يُرجح أن تكون أسماء النطاقات DNS جاهزة في الوقت الذي يطلب فيه التطبيق هذه العناصر، ويقلل ذلك التأخير الحاصل عند طلب الرابط.<syntaxhighlight lang="javascript">
 
{
 
{
 
   key: 'X-DNS-Prefetch-Control',
 
   key: 'X-DNS-Prefetch-Control',
سطر 31: سطر 31:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== الترويسة Strict-Transport-Security ===
+
=== Strict-Transport-Security ===
 
تخبر هذه الترويسة المتصفحات بضرورة استخدام برتوكول HTTPS بدلًا من HTTP. ويحدد الإعداد التالي أن جميع النطاقات الفرعية الحالية والمستقبلية ستستخدم بروتكول HTTPS خلال فترة زمنية أقصاها <code>max-age</code> سنتان. وبهذا الإعداد سيُمنع المتصفح من الدخول إلى الصفحات أو النطاقات التي تُخدِّم الطلبات من خلال بروتوكول HTTP.   
 
تخبر هذه الترويسة المتصفحات بضرورة استخدام برتوكول HTTPS بدلًا من HTTP. ويحدد الإعداد التالي أن جميع النطاقات الفرعية الحالية والمستقبلية ستستخدم بروتكول HTTPS خلال فترة زمنية أقصاها <code>max-age</code> سنتان. وبهذا الإعداد سيُمنع المتصفح من الدخول إلى الصفحات أو النطاقات التي تُخدِّم الطلبات من خلال بروتوكول HTTP.   
  
سطر 41: سطر 41:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== الترويسة X-XSS-Protection ===
+
=== X-XSS-Protection ===
 
توقِف هذه الترويسة تحميل الصفحات عندما تستشعر بوجود هجمات XSS منعكسة (ReflectedCross site scripting). وعلى الرغم من أن هذا النوع من الحماية غير ضروري عندما تتبنى المواقع ترويسة <code>Content-Security-Policy</code> بإعدادات قوية تعطّل استخدام شيفرة سطرية (<code>'unsafe-inline'</code>)، إلا أنها تُعد عامل حماية للمتصفحات الأقدم التي لا تدعم الترويسة CSP.<syntaxhighlight lang="javascript">
 
توقِف هذه الترويسة تحميل الصفحات عندما تستشعر بوجود هجمات XSS منعكسة (ReflectedCross site scripting). وعلى الرغم من أن هذا النوع من الحماية غير ضروري عندما تتبنى المواقع ترويسة <code>Content-Security-Policy</code> بإعدادات قوية تعطّل استخدام شيفرة سطرية (<code>'unsafe-inline'</code>)، إلا أنها تُعد عامل حماية للمتصفحات الأقدم التي لا تدعم الترويسة CSP.<syntaxhighlight lang="javascript">
 
{
 
{
سطر 49: سطر 49:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== الترويسة X-Frame-Options ===
+
=== X-Frame-Options ===
 
تحدد هذه الترويسة إذا ما كان مسموحًا للصفحة أن تعرض عناصر الإطارات الخارجية <code>iframe</code>، وتستخدم هذه الترويسة لإيقاف هجمات الاختطاف بالنقر clickjacking attacks. حلت الترويسة <code>frame-ancestors</code> مكانها حاليًا والتي تعُد أفضل دعمًا في المتصفحات الحديثة.<syntaxhighlight lang="javascript">
 
تحدد هذه الترويسة إذا ما كان مسموحًا للصفحة أن تعرض عناصر الإطارات الخارجية <code>iframe</code>، وتستخدم هذه الترويسة لإيقاف هجمات الاختطاف بالنقر clickjacking attacks. حلت الترويسة <code>frame-ancestors</code> مكانها حاليًا والتي تعُد أفضل دعمًا في المتصفحات الحديثة.<syntaxhighlight lang="javascript">
 
{
 
{
سطر 57: سطر 57:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== الترويسة Permissions-Policy ===
+
=== Permissions-Policy ===
 
تسمح لك هذه الترويسة عبر [https://www.w3.org/TR/permissions-policy-1/ خياراتها] بالتحكم بالميزات والواجهات البرمجية التي تُستخدم في المتصفح، وعرفت سابقًا بالاسم <code>Feature-Policy</code>. <syntaxhighlight lang="javascript">
 
تسمح لك هذه الترويسة عبر [https://www.w3.org/TR/permissions-policy-1/ خياراتها] بالتحكم بالميزات والواجهات البرمجية التي تُستخدم في المتصفح، وعرفت سابقًا بالاسم <code>Feature-Policy</code>. <syntaxhighlight lang="javascript">
 
{
 
{
سطر 65: سطر 65:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== الترويسة X-Content-Type-Options ===
+
=== X-Content-Type-Options ===
تمنع هذه الترويسة المتصفح من تخمين نوع المحتوى <code>Content-Type</code> إن لم يكن محددًا صراحة. وهكذا يمكن أن يمنع استخدام هذه الترويسة انتشار سكربتات XSS في المواقع التي تسمح للمستخدمين برفع ومشاركة الملفات. فإن حاول مستخدم مثلًا تنزيل صورة وتعامل معها المتصفح على أنها محتوى من نوع آخر كأن تكون ملفًا تنفيذيًا، سيبدو الأمر مثيرًا للشكوك. تثطبق هذه الترويسة أيضًا على توسيعات المتصفحات، ولها قيمة واحدة فقط هي <code>nosniff</code>.<syntaxhighlight lang="javascript">
+
تمنع هذه الترويسة المتصفح من تخمين نوع المحتوى <code>Content-Type</code> إن لم يكن محددًا صراحة. وهكذا يمكن أن يمنع استخدام هذه الترويسة انتشار سكربتات XSS في المواقع التي تسمح للمستخدمين برفع ومشاركة الملفات. فإن حاول مستخدم مثلًا تنزيل صورة وتعامل معها المتصفح على أنها محتوى من نوع آخر كأن تكون ملفًا تنفيذيًا، سيبدو الأمر مثيرًا للشكوك. تثطبق هذه الترويسة أيضًا على إضافات المتصفحات، ولها قيمة واحدة فقط هي <code>nosniff</code>.<syntaxhighlight lang="javascript">
 
{
 
{
 
   key: 'X-Content-Type-Options',
 
   key: 'X-Content-Type-Options',
سطر 73: سطر 73:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== الترويسة Referrer-Policy ===
+
=== Referrer-Policy ===
 
تتحكم هذه الترويسة عبر [https://scotthelme.co.uk/a-new-security-header-referrer-policy/ خياراتها] بكمية المعلومات التي يحملها المتصفح عند الانتقال من الموقع الحالي إلى آخر.<syntaxhighlight lang="javascript">
 
تتحكم هذه الترويسة عبر [https://scotthelme.co.uk/a-new-security-header-referrer-policy/ خياراتها] بكمية المعلومات التي يحملها المتصفح عند الانتقال من الموقع الحالي إلى آخر.<syntaxhighlight lang="javascript">
 
{
 
{
سطر 81: سطر 81:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== الترويسة Content-Security-Policy ===
+
=== Content-Security-Policy ===
 
تساعد هذه الترويسة في منع حقن السكربتات ذات الأصل المشترك (هجمات XSS)، وهجمات الاختطاف بالنقر وغيرها من هجمات حقن الشيفرة. تحدد هذه الترويسة [https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP الأصول المسموحة] عند تحميل محتوى يضم سكربتات أو أوراق تنسيق أو صور أو خطوط كتابة أو كائنات أو وسائط (صوت، فيديو) أو الإطارات الخارجية iframes وغيرها.
 
تساعد هذه الترويسة في منع حقن السكربتات ذات الأصل المشترك (هجمات XSS)، وهجمات الاختطاف بالنقر وغيرها من هجمات حقن الشيفرة. تحدد هذه الترويسة [https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP الأصول المسموحة] عند تحميل محتوى يضم سكربتات أو أوراق تنسيق أو صور أو خطوط كتابة أو كائنات أو وسائط (صوت، فيديو) أو الإطارات الخارجية iframes وغيرها.
  

مراجعة 13:56، 24 ديسمبر 2022

تُستخدم الترويسات headers في ملف التهيئة next.config.js لتطبيق ترويسات استجابة HTTP على جميع الوجهات في تطبيقك لتحسين مستوى الأمان فيه.

// next.config.js

// يمكنك اختيار الترويسات التي تضيفها إلى القائمة
// بعد أن تتعلم المزيد تاليًا
const securityHeaders = []

module.exports = {
  async headers() {
    return [
      {
        // طبِّق هذه الترويسة على جميع وجهات تطبيقك
        source: '/:path*',
        headers: securityHeaders,
      },
    ]
  },
}

الترويسات المتاحة للاستخدام في Next.js

إليك بعض الترويسات التي يمكنك إضافتها إلى تطبيقك:

X-DNS-Prefetch-Control

تتحكم هذه الترويسة بالإحضار المسبق لبيانات خادم DNS مما يتيح للمتصفح تحديد أسماء النطاقات للروابط الخارجية مسبقًا مثل ملفات CSS وملفات JavaScript وغيرها. تُنفَّذ هذه العملية خلف الستار، وهكذا يُرجح أن تكون أسماء النطاقات DNS جاهزة في الوقت الذي يطلب فيه التطبيق هذه العناصر، ويقلل ذلك التأخير الحاصل عند طلب الرابط.

{
  key: 'X-DNS-Prefetch-Control',
  value: 'on'
}

Strict-Transport-Security

تخبر هذه الترويسة المتصفحات بضرورة استخدام برتوكول HTTPS بدلًا من HTTP. ويحدد الإعداد التالي أن جميع النطاقات الفرعية الحالية والمستقبلية ستستخدم بروتكول HTTPS خلال فترة زمنية أقصاها max-age سنتان. وبهذا الإعداد سيُمنع المتصفح من الدخول إلى الصفحات أو النطاقات التي تُخدِّم الطلبات من خلال بروتوكول HTTP.

إن كنت ستنشر التطبيق على Vercel، لن تحتاج إلى هذه الترويسة فهي تُضاف تلقائيًا إلى كل التوزيعات إلا في الحالة التي تُصرِّح فيها عن الترويسات headers في ملف الإعداد next.config.js.

{
  key: 'Strict-Transport-Security',
  value: 'max-age=63072000; includeSubDomains; preload'
}

X-XSS-Protection

توقِف هذه الترويسة تحميل الصفحات عندما تستشعر بوجود هجمات XSS منعكسة (ReflectedCross site scripting). وعلى الرغم من أن هذا النوع من الحماية غير ضروري عندما تتبنى المواقع ترويسة Content-Security-Policy بإعدادات قوية تعطّل استخدام شيفرة سطرية ('unsafe-inline')، إلا أنها تُعد عامل حماية للمتصفحات الأقدم التي لا تدعم الترويسة CSP.

{
  key: 'X-XSS-Protection',
  value: '1; mode=block'
}

X-Frame-Options

تحدد هذه الترويسة إذا ما كان مسموحًا للصفحة أن تعرض عناصر الإطارات الخارجية iframe، وتستخدم هذه الترويسة لإيقاف هجمات الاختطاف بالنقر clickjacking attacks. حلت الترويسة frame-ancestors مكانها حاليًا والتي تعُد أفضل دعمًا في المتصفحات الحديثة.

{
  key: 'X-Frame-Options',
  value: 'SAMEORIGIN'
}

Permissions-Policy

تسمح لك هذه الترويسة عبر خياراتها بالتحكم بالميزات والواجهات البرمجية التي تُستخدم في المتصفح، وعرفت سابقًا بالاسم Feature-Policy.

{
  key: 'Permissions-Policy',
  value: 'camera=(), microphone=(), geolocation=(), interest-cohort=()'
}

X-Content-Type-Options

تمنع هذه الترويسة المتصفح من تخمين نوع المحتوى Content-Type إن لم يكن محددًا صراحة. وهكذا يمكن أن يمنع استخدام هذه الترويسة انتشار سكربتات XSS في المواقع التي تسمح للمستخدمين برفع ومشاركة الملفات. فإن حاول مستخدم مثلًا تنزيل صورة وتعامل معها المتصفح على أنها محتوى من نوع آخر كأن تكون ملفًا تنفيذيًا، سيبدو الأمر مثيرًا للشكوك. تثطبق هذه الترويسة أيضًا على إضافات المتصفحات، ولها قيمة واحدة فقط هي nosniff.

{
  key: 'X-Content-Type-Options',
  value: 'nosniff'
}

Referrer-Policy

تتحكم هذه الترويسة عبر خياراتها بكمية المعلومات التي يحملها المتصفح عند الانتقال من الموقع الحالي إلى آخر.

{
  key: 'Referrer-Policy',
  value: 'origin-when-cross-origin'
}

Content-Security-Policy

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

بإمكانك كتابة توجيهات الترويسة CSP باستخدام قالب نصي:

//قبل تعريف ترويسات الأمان
//باستخدام القالب النصي التالي Content Security Policy أضف توجيهات 

const ContentSecurityPolicy = `
  default-src 'self';
  script-src 'self';
  child-src example.com;
  style-src 'self' example.com;
  font-src 'self';

عندما يستخدم التوجيه كلمة مفتاحية مثل self، عليك تغليفها ضمن إشارتي تنصيص مفردتين ''. ولا بد من استبدال محرف السطر الجديد المستخدم في القالب النصي بنص فارغ كما يلي:

{
  key: 'Content-Security-Policy',
  value: ContentSecurityPolicy.replace(/\s{2,}/g, ' ').trim()
}

المصادر