الفرق بين المراجعتين لصفحة: «Next.js/security headers»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) ط مراجعة |
||
سطر 23: | سطر 23: | ||
إليك بعض الترويسات التي يمكنك إضافتها إلى تطبيقك: | إليك بعض الترويسات التي يمكنك إضافتها إلى تطبيقك: | ||
=== | === 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] مما يتيح للمتصفح تحديد أسماء النطاقات للروابط الخارجية مسبقًا مثل ملفات | تتحكم هذه الترويسة بالإحضار المسبق لبيانات خادم [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 === | ||
تخبر هذه الترويسة المتصفحات بضرورة استخدام برتوكول HTTPS بدلًا من HTTP. ويحدد الإعداد التالي أن جميع النطاقات الفرعية الحالية والمستقبلية ستستخدم بروتكول HTTPS خلال فترة زمنية أقصاها <code>max-age</code> سنتان. وبهذا الإعداد سيُمنع المتصفح من الدخول إلى الصفحات أو النطاقات التي تُخدِّم الطلبات من خلال بروتوكول HTTP. | تخبر هذه الترويسة المتصفحات بضرورة استخدام برتوكول HTTPS بدلًا من HTTP. ويحدد الإعداد التالي أن جميع النطاقات الفرعية الحالية والمستقبلية ستستخدم بروتكول HTTPS خلال فترة زمنية أقصاها <code>max-age</code> سنتان. وبهذا الإعداد سيُمنع المتصفح من الدخول إلى الصفحات أو النطاقات التي تُخدِّم الطلبات من خلال بروتوكول HTTP. | ||
سطر 41: | سطر 41: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === 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 === | ||
تحدد هذه الترويسة إذا ما كان مسموحًا للصفحة أن تعرض عناصر الإطارات الخارجية <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 === | ||
تسمح لك هذه الترويسة عبر [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 === | ||
تمنع هذه الترويسة المتصفح من تخمين نوع المحتوى <code>Content-Type</code> إن لم يكن محددًا صراحة. وهكذا يمكن أن يمنع استخدام هذه الترويسة انتشار سكربتات XSS في المواقع التي تسمح للمستخدمين برفع ومشاركة الملفات. فإن حاول مستخدم مثلًا تنزيل صورة وتعامل معها المتصفح على أنها محتوى من نوع آخر كأن تكون ملفًا تنفيذيًا، سيبدو الأمر مثيرًا للشكوك. تثطبق هذه الترويسة أيضًا على | تمنع هذه الترويسة المتصفح من تخمين نوع المحتوى <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 === | ||
تتحكم هذه الترويسة عبر [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 === | ||
تساعد هذه الترويسة في منع حقن السكربتات ذات الأصل المشترك (هجمات 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()
}
المصادر
- الصفحة Security Headers من توثيق Next.js الرسمي.