如何保障Node.js端点安全,仅允许自有网站访问?
现有安全配置的局限性
CORS配置
你的CORS设置仅能限制浏览器发起的跨域请求,对于直接通过HTTP客户端(如curl、Postman)或机器人发起的请求完全无效——因为CORS是浏览器层面的安全机制,服务器不会主动拦截非浏览器的跨域请求。
Host头检查
Host头校验有一定作用,但存在明显漏洞:
- 请求的Host头极易被伪造;
- 如果服务部署在反向代理(如Nginx、Cloudflare)之后,直接检查
host变量可能拿到的是代理服务器的Host,而非真实请求的Host,会导致合法请求被误拦截。
额外安全防护建议
针对公开端点的访问限制和防机器人需求,可添加以下实用措施:
1. API密钥验证
给合法客户端分配唯一API密钥,要求请求时在请求头(如X-API-Key)携带密钥,服务器端校验有效性:
app.use((req, res, next) => { const apiKey = req.headers['x-api-key']; if (!apiKey || apiKey !== process.env.VALID_API_KEY) { return res.status(403).json({ message: "forbidden access" }); } next(); });
注意:密钥需存储在环境变量中,禁止硬编码到代码里。
2. 速率限制(Rate Limiting)
用express-rate-limit中间件限制单位时间内的请求次数,防止机器人或恶意用户频繁请求:
const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15分钟周期 max: 100, // 单IP最多100次请求 message: { message: "请求过于频繁,请稍后再试" } }); app.use('/your-public-endpoint', limiter);
3. 校验真实客户端IP
若使用反向代理,先配置信任代理,再获取真实客户端IP,避免被伪造IP欺骗:
// 信任反向代理(如Nginx、Cloudflare) app.set('trust proxy', true); // 获取真实IP const clientIp = req.ip;
可结合速率限制或IP白名单使用。
4. IP白名单(可选)
若合法用户IP范围固定,可配置IP白名单:
const allowedIps = ['192.168.1.1', '203.0.113.5']; app.use((req, res, next) => { const clientIp = req.ip; if (!allowedIps.includes(clientIp)) { return res.status(403).json({ message: "forbidden access" }); } next(); });
注意:若用户IP不固定,此方案不适用。
5. 人机验证(如reCAPTCHA)
如果端点面向用户交互场景,可在前端添加reCAPTCHA,服务器端验证验证码有效性,阻止机器人自动提交请求。
6. 请求签名验证
针对敏感接口,要求客户端对请求参数+时间戳进行签名,服务器端重新计算签名并校验,防止请求被篡改或重放:
const crypto = require('crypto'); app.use((req, res, next) => { const timestamp = req.headers['x-timestamp']; const signature = req.headers['x-signature']; const secret = process.env.SIGNATURE_SECRET; // 校验请求是否过期(比如5分钟内有效) if (Date.now() - parseInt(timestamp) > 5 * 60 * 1000) { return res.status(403).json({ message: "请求已过期" }); } // 重新计算签名 const computedSignature = crypto.createHmac('sha256', secret) .update(JSON.stringify(req.body) + timestamp) .digest('hex'); if (computedSignature !== signature) { return res.status(403).json({ message: "无效的请求签名" }); } next(); });
总结
你现有的配置仅能提供基础的跨域和Host头校验,无法有效阻止机器人或恶意访问。结合API密钥、速率限制、真实IP校验等措施,可大幅提升端点的安全性。
内容的提问来源于stack exchange,提问作者Ashish Ranjan
相关产品推荐
相关产品推荐

