黑哥的梦呓 问:
给我个在 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 等安全头部设置,同时还包括了环境变量保护、依赖安全以及日志监控系统的使用。
通过这些配置,黑哥的梦呓 可以显著提高网站的安全性,减少潜在的攻击风险。