黑哥的梦呓
1173 字
6 分钟
在 Vercel 上部署 Next.js 框架网站的建站安全方案

黑哥的梦呓 问:#

给我个在 Vercel 上部署 Next.js 框架网站的建站安全方案,包括基础防护措施和高级防护措施,尽可能详细,提供具体代码及详细配置方案

ChatGPT.com 答:#

在 Vercel 上部署 Next.js 网站时,确保网站的安全性至关重要。以下是一个全面的安全方案,包括基础防护和高级防护措施,帮助你保护网站免受潜在攻击。

基础防护措施#

1. 强制 HTTPS#

Vercel 默认使用 HTTPS,但 黑哥的梦呓 可以通过设置 Strict-Transport-Security 头部来确保所有流量都通过 HTTPS,并启用 HSTS(HTTP 严格传输安全)。

配置示例:#

next.config.js 中添加 Vercel 自定义头部:

module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "Strict-Transport-Security",
            value: "max-age=63072000; includeSubDomains; preload"
          }
        ]
      }
    ];
  }
};

2. 内容安全策略 (CSP)#

CSP 通过指定哪些资源可以加载,防止 XSS 攻击和数据注入攻击。

配置示例:#

next.config.js 中配置 CSP 头部:

module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "Content-Security-Policy",
            value: "default-src 'self'; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline';"
          }
        ]
      }
    ];
  }
};

3. X-Content-Type-Options#

防止 MIME 类型嗅探攻击,通过设置 nosniff 来确保文件类型一致性。

配置示例:#

next.config.js 中添加头部:

module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "X-Content-Type-Options",
            value: "nosniff"
          }
        ]
      }
    ];
  }
};

4. Referrer-Policy#

限制 Referer 头部发送的信息,防止敏感信息泄露。

配置示例:#

next.config.js 中添加头部:

module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "Referrer-Policy",
            value: "no-referrer"
          }
        ]
      }
    ];
  }
};

5. XSS 防护#

Next.js 默认的 React 自动转义特性可以有效防止 XSS 攻击。确保正确处理动态数据,并避免使用 dangerouslySetInnerHTML,除非对数据来源有足够的信任。

6. 跨站请求伪造 (CSRF) 防护#

Next.js 中表单提交或 API 请求时应使用 CSRF 令牌进行防护,确保请求的合法性。可以使用 csurf 中间件来防止 CSRF 攻击。

安装:#

pnpm add csurf

使用示例:#

在 API 路由中应用 CSRF 保护:

import csrf from 'csurf';
import { NextApiRequest, NextApiResponse } from 'next';

const csrfProtection = csrf({ cookie: true });

export default function handler(req, res) {
  csrfProtection(req, res, () => {
    res.status(200).json({ csrfToken: req.csrfToken() });
  });
}

高级防护措施#

7. 点击劫持 (Clickjacking) 防护#

使用 X-Frame-Options 和 CSP 的 frame-ancestors 指令来防止你的页面被嵌入到其他网页的 iframe 中,从而防止点击劫持攻击。

配置示例:#

next.config.js 中添加头部:

module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "X-Frame-Options",
            value: "DENY"
          },
          {
            key: "Content-Security-Policy",
            value: "frame-ancestors 'none';"
          }
        ]
      }
    ];
  }
};

8. 速率限制 (Rate Limiting)#

通过 Vercel Edge Functions 或 API 路由实现速率限制,防止 DDoS 攻击或恶意请求泛滥。

使用示例:#

在 API 路由中实现简单的速率限制(假设你使用 Redis 作为速率限制存储):

import rateLimit from 'express-rate-limit';

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 分钟
  max: 100 // 每 IP 最多 100 次请求
});

export default async function handler(req, res) {
  limiter(req, res, () => {
    res.status(200).json({ message: "Request allowed" });
  });
}

9. 环境变量保护#

确保在客户端代码中不会暴露敏感环境变量。Next.js 提供了内置的机制来处理环境变量,通过 NEXT_PUBLIC_ 前缀暴露给客户端。只有前缀 NEXT_PUBLIC_ 的环境变量会在客户端中可见。

.env.local 文件中配置环境变量:

NEXT_PUBLIC_API_KEY=your_public_key
SECRET_API_KEY=your_secret_key

确保 SECRET_API_KEY 只在服务器端访问,避免暴露在客户端。

10. 依赖安全#

定期检查并更新依赖项,使用 pnpm audit 或其他工具来检测依赖中的已知漏洞。

使用示例:#

运行以下命令检查依赖项的安全性:

pnpm audit

11. 日志与监控#

使用日志记录和监控系统来追踪异常和潜在的攻击。可以使用服务如 Sentry 或 Datadog 来捕获错误并进行监控。

安装 Sentry:#

pnpm add @sentry/nextjs

使用示例:#

sentry.server.config.js 中初始化 Sentry:

import * as Sentry from '@sentry/nextjs';

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  tracesSampleRate: 1.0,
});

完整的 next.config.js 文件#

module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "Strict-Transport-Security",
            value: "max-age=63072000; includeSubDomains; preload"
          },
          {
            key: "Content-Security-Policy",
            value: "default-src 'self'; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'; frame-ancestors 'none';"
          },
          {
            key: "X-Frame-Options",
            value: "DENY"
          },
          {
            key: "X-Content-Type-Options",
            value: "nosniff"
          },
          {
            key: "Referrer-Policy",
            value: "no-referrer"
          }
        ]
      }
    ];
  }
};

这个 next.config.js 文件为你的 Next.js 网站提供了基础和高级的防护措施,结合了 HSTS、CSP、X-Frame-Options 等安全头部设置,同时还包括了环境变量保护、依赖安全以及日志监控系统的使用。

通过这些配置,黑哥的梦呓 可以显著提高网站的安全性,减少潜在的攻击风险。

在 Vercel 上部署 Next.js 框架网站的建站安全方案
https://hackersay.top/posts/the-security-plan-for-deploying-next-js-framework-websites-on-vercel/
作者
黑哥的梦呓
发布于
2024-08-31
许可协议
CC BY-NC-SA 4.0