You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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库简化配置:

  1. 安装依赖:npm install cors
  2. 配置使用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:13:16