تنظیم CSP بدون nonce در Next.js – استفاده از Subresource Integrity و پیکربندی امن در محیط‌های تولید

اگر اپلیکیشن شما به nonce نیاز ندارد، می‌توانید هدر Content Security Policy را مستقیماً در فایل next.config.js تنظیم کنید. همچنین Next.js از Subresource Integrity (SRI) به‌صورت آزمایشی پشتیبانی می‌کند که امکان استفاده از CSP سخت‌گیرانه را بدون نیاز به رندرینگ پویا فراهم می‌سازد. این مقاله نحوهٔ پیکربندی CSP، فعال‌سازی SRI، تفاوت‌های محیط توسعه و تولید، و نکات امنیتی مربوط به اسکریپت‌های ثالث را بررسی می‌کند.

CSP without nonceSubresource IntegritySecurity configurationStatic Next.js

~4 دقیقه مطالعه · آخرین به‌روزرسانی ۴ آبان ۱۴۰۴

تنظیم CSP بدون استفاده از nonce


اگر اپلیکیشن شما به اجرای اسکریپت‌های inline نیازی ندارد، می‌توانید هدر CSP را مستقیماً در فایل next.config.js تنظیم کنید:

const cspHeader = `
  default-src 'self';
  script-src 'self' 'unsafe-eval' 'unsafe-inline';
  style-src 'self' 'unsafe-inline';
  img-src 'self' blob: data:;
  font-src 'self';
  object-src 'none';
  base-uri 'self';
  form-action 'self';
  frame-ancestors 'none';
  upgrade-insecure-requests;
`

module.exports = {
  async headers() {
    return [
      {
        source: '/(.*)',
        headers: [
          {
            key: 'Content-Security-Policy',
            value: cspHeader.replace(/\n/g, ''),
          },
        ],
      },
    ]
  },
}

استفاده از Subresource Integrity (SRI)


Next.js به‌صورت آزمایشی از SRI برای CSP مبتنی بر هش پشتیبانی می‌کند. این روش امکان استفاده از رندرینگ استاتیک و کش CDN را فراهم می‌سازد.


فعال‌سازی SRI


در فایل next.config.js تنظیم زیر را اضافه کنید:

const nextConfig = {
  experimental: {
    sri: {
      algorithm: 'sha256',
    },
  },
}

module.exports = nextConfig

پیکربندی CSP همراه با SRI


می‌توانید همچنان از سیاست‌های CSP خود استفاده کنید. SRI به‌صورت مستقل هش‌های امنیتی را به اسکریپت‌ها اضافه می‌کند:

const cspHeader = `
  default-src 'self';
  script-src 'self';
  style-src 'self';
  img-src 'self' blob: data:;
  font-src 'self';
  object-src 'none';
  base-uri 'self';
  form-action 'self';
  frame-ancestors 'none';
  upgrade-insecure-requests;
`

module.exports = {
  experimental: {
    sri: {
      algorithm: 'sha256',
    },
  },
  async headers() {
    return [
      {
        source: '/(.*)',
        headers: [
          {
            key: 'Content-Security-Policy',
            value: cspHeader.replace(/\n/g, ''),
          },
        ],
      },
    ]
  },
}

مزایای SRI نسبت به nonce


  • پشتیبانی از رندرینگ استاتیک
  • سازگاری با کش CDN
  • عملکرد بهتر بدون نیاز به SSR در هر درخواست
  • امنیت در زمان build با تولید هش‌های رمزنگاری‌شده

محدودیت‌های SRI


  • آزمایشی بودن ویژگی
  • فقط در Webpack فعال است (نه Turbopack)
  • فقط در App Router پشتیبانی می‌شود
  • فقط در زمان build قابل استفاده است

تفاوت محیط توسعه و تولید


محیط توسعه


در حالت توسعه، برای پشتیبانی از ابزارهای دیباگ باید 'unsafe-eval' فعال باشد:

const isDev = process.env.NODE_ENV === 'development'

const cspHeader = `
  default-src 'self';
  script-src 'self' 'nonce-${nonce}' 'strict-dynamic' ${isDev ? "'unsafe-eval'" : ''};
  style-src 'self' ${isDev ? "'unsafe-inline'" : `'nonce-${nonce}'`};
  ...
`

محیط تولید


  • اطمینان حاصل کنید که Proxy روی همهٔ مسیرهای لازم اجرا می‌شود
  • مطمئن شوید که CSP اجازهٔ بارگذاری فایل‌های استاتیک Next.js را می‌دهد
  • دامنه‌های اسکریپت‌های ثالث را به CSP اضافه کنید

اسکریپت‌های ثالث و CSP


برای استفاده از سرویس‌هایی مانند Google Tag Manager:

import { GoogleTagManager } from '@next/third-parties/google'
import { headers } from 'next/headers'

export default async function RootLayout({ children }) {
  const nonce = (await headers()).get('x-nonce')

  return (
    <html lang="en">
      <body>
        {children}
        <GoogleTagManager gtmId="GTM-XYZ" nonce={nonce} />
      </body>
    </html>
  )
}

نمونهٔ CSP برای اسکریپت‌های گوگل


const cspHeader = `
  default-src 'self';
  script-src 'self' 'nonce-${nonce}' 'strict-dynamic' https://www.googletagmanager.com;
  connect-src 'self' https://www.google-analytics.com;
  img-src 'self' data: https://www.google-analytics.com;
`

خطاهای رایج در CSP


  • استایل‌های inline: از کتابخانه‌هایی استفاده کنید که از nonce پشتیبانی می‌کنند یا استایل‌ها را به فایل خارجی منتقل کنید
  • importهای پویا: مطمئن شوید که در script-src مجاز هستند
  • WebAssembly: در صورت نیاز 'wasm-unsafe-eval' را اضافه کنید
  • Service Worker: سیاست‌های مناسب برای اسکریپت‌های آن را تنظیم کنید

تاریخچه نسخه‌ها


نسخهتغییرات
v14.0.0افزوده شدن پشتیبانی آزمایشی از SRI برای CSP مبتنی بر هش
v13.4.20پیشنهاد شده برای مدیریت صحیح nonce و هدرهای CSP

جمع‌بندی


اگر اپلیکیشن شما به nonce نیاز ندارد، می‌توانید با استفاده از SRI و تنظیم مستقیم هدر CSP امنیت را حفظ کرده و از مزایای رندرینگ استاتیک و کش CDN بهره‌مند شوید. این روش برای اپلیکیشن‌هایی که به عملکرد بالا و امنیت در زمان build نیاز دارند، بسیار مناسب است.


نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

مسیریابی پیشرفته و هوک‌های عملکرد در Next.js — راهنمای توسعه‌دهنده برای App Router

Next.js مجموعه‌ای غنی از هوک‌های کلاینت و ابزارهای کش و ناوبری را در اختیار توسعه‌دهندگان قرار می‌دهد. از خواندن پارامترهای مسیر تا گزارش Web Vitals و مدیریت کش، این مقاله مهم‌ترین ابزارهای App Router را با مثال‌های کاربردی معرفی می‌کند.

ادامه

مدیریت احراز هویت و کش در Next.js — راهنمای توسعه‌دهنده برای امنیت و عملکرد پویا

Next.js با معرفی قابلیت‌های آزمایشی جدید، امکان کنترل دقیق‌تر دسترسی و کش داده‌ها را فراهم کرده است. تابع unauthorized برای مدیریت خطای 401 و هدایت کاربران به صفحه ورود، unstable_cache برای کش هوشمند عملیات سنگین، updateTag برای بازسازی آنی داده‌ها، و useLinkStatus برای نمایش وضعیت ناوبری استفاده می‌شوند. این مقاله نحوه استفاده از این ابزارها را با مثال‌های کاربردی و نکات مهم بررسی می‌کند.

ادامه

redirect و refresh در Next.js — ریدایرکت‌های هوشمند و تازه‌سازی مسیر در Server Actions

تابع redirect در Next.js برای هدایت کاربر به مسیر جدید استفاده می‌شود و بسته به نوع استفاده، پاسخ HTTP با وضعیت 307 یا 303 ارسال می‌کند. این تابع در Server Components، Client Components، Route Handlers و Server Actions قابل استفاده است. تابع refresh نیز برای تازه‌سازی مسیر کلاینت از درون Server Action استفاده می‌شود. این مقاله نحوه استفاده از هر دو تابع را با مثال‌های کاربردی و نکات مهم توضیح می‌دهد.

ادامه

Next.js با معرفی NextRequest و NextResponse، APIهای Request و Response مرورگر را گسترش داده و ابزارهای قدرتمندی برای مدیریت کوکی‌ها، هدرها، ریدایرکت‌ها، بازنویسی مسیرها و پاسخ‌های JSON فراهم کرده است. این مقاله نحوه استفاده از این ابزارها را با مثال‌های کاربردی و نکات امنیتی توضیح می‌دهد.

Next.js با معرفی NextRequest و NextResponse، APIهای Request و Response مرورگر را گسترش داده و ابزارهای قدرتمندی برای مدیریت کوکی‌ها، هدرها، ریدایرکت‌ها، بازنویسی مسیرها و پاسخ‌های JSON فراهم کرده است. این مقاله نحوه استفاده از این ابزارها را با مثال‌های کاربردی و نکات امنیتی توضیح می‌دهد.

ادامه

headers، ImageResponse، notFound و permanentRedirect در Next.js — مدیریت درخواست‌ها، تولید تصویر، خطا و ریدایرکت

Next.js ابزارهای قدرتمندی برای مدیریت درخواست‌ها و پاسخ‌ها در کامپوننت‌های سروری فراهم کرده است. تابع headers برای خواندن هدرهای HTTP ورودی، ImageResponse برای تولید تصاویر داینامیک، notFound برای نمایش صفحه خطای 404، و permanentRedirect برای ریدایرکت دائمی کاربران استفاده می‌شوند. این مقاله نحوه استفاده از هر یک را با مثال‌های کاربردی توضیح می‌دهد.

ادامه

راهنمای کامل استفاده از metadata و generateMetadata در Next.js

در نسخه‌های مدرن Next.js، مدیریت metadata صفحات بسیار قدرتمندتر و ساده‌تر شده است. metadata به‌صورت خودکار در تگ <head> صفحات تزریق می‌شود و نقش مهمی در SEO، اشتراک‌گذاری اجتماعی و تجربه کاربری دارد. این مقاله دو روش اصلی تعریف metadata را بررسی می‌کند: استفاده از آبجکت ثابت metadata و تابع داینامیک generateMetadata.

ادامه