如何限制Express JS API访问?含请求来源域名校验方法
Express API 来源域名检查与访问限制方案
1. 检查请求的来源域名
- 针对浏览器发起的跨域请求,可通过
req.get('Origin')获取可靠的来源域名,该字段由浏览器自动添加,格式类似https://website-1.com。 - 对于非浏览器的HTTP请求(如curl、Postman调用),可尝试读取
Referer头(req.get('Referer')),但该字段可被手动伪造,可靠性较低。 - 示例代码:
app.use((req, res, next) => { const origin = req.get('Origin'); const referer = req.get('Referer'); console.log('请求来源(Origin):', origin); console.log('请求来源(Referer):', referer); next(); });
2. 限制仅允许指定域名访问
方法一:手动实现校验中间件
定义允许的域名列表,通过中间件完成校验与CORS头配置:
const allowedOrigins = ['https://website-1.com', 'https://website-2.com']; app.use((req, res, next) => { const origin = req.get('Origin'); // 允许无Origin的请求(如服务器端直接调用),不需要可删除此判断 if (!origin) return next(); if (allowedOrigins.includes(origin)) { // 配置CORS响应头,允许合法跨域请求 res.setHeader('Access-Control-Allow-Origin', origin); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); next(); } else { res.status(403).send('Forbidden: 不允许的来源域名'); } });
方法二:使用cors npm包(推荐)
借助官方常用的cors库简化配置:
- 安装依赖:
npm install cors - 配置使用:
const cors = require('cors'); const allowedOrigins = ['https://website-1.com', 'https://website-2.com']; const corsOptions = { origin: (origin, callback) => { // 允许无Origin的请求,不需要可删除!origin判断 if (!origin || allowedOrigins.includes(origin)) { callback(null, true); } else { callback(new Error('Not allowed by CORS')); } } }; // 全局应用到所有路由 app.use(cors(corsOptions)); // 或仅应用到特定路由 app.get('/route1', cors(corsOptions), (req, res) => { res.send('Route 1 response'); });
容易遗漏的要点
- Origin头的可靠性:浏览器发起的CORS请求中,
Origin头无法被前端JS篡改,是可靠的来源标识;但非浏览器请求可伪造Origin,这类场景需结合API密钥、JWT令牌等额外验证方式。 - 预请求处理:浏览器发起复杂跨域请求(如PUT/DELETE、带自定义头)前会发送OPTIONS预请求,
cors包会自动处理,手动实现时需单独响应OPTIONS请求,避免跨域报错。 - 域名匹配的细节:注意区分HTTP/HTTPS协议(
http://website-1.com与https://website-1.com是不同来源),若需允许主域名下所有子域名,可使用正则匹配,如/^https?:\/\/.*\.example\.com$/。 - 环境区分:开发环境通常需允许
http://localhost:xxxx这类本地域名,不要将开发配置直接带到生产环境。
内容的提问来源于stack exchange,提问作者the-tech-seeker
相关产品推荐
相关产品推荐

