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

Express后端CORS配置优化:拦截非浏览器及非法来源请求

增强Express CORS配置安全性及User-Agent验证实现

一、修复现有CORS配置的核心漏洞

你当前的CORS配置里,!origin的判断允许了无Origin头的请求——而cURL、Postman这类非浏览器工具默认不会发送Origin头,这正是它们能直接访问API的原因。第一步要去掉这个宽松判断,仅允许指定域名的请求:

const allowedOrigins = ["https://example.com"];
app.use(
  cors({
    origin: function (origin, callback) {
      // 只放行指定Origin的请求,拒绝无Origin头的请求
      if (allowedOrigins.indexOf(origin) !== -1) {
        callback(null, true);
      } else {
        callback(new Error("Not allowed by CORS"));
      }
    },
    methods: ["POST"],
    optionsSuccessStatus: 200,
    credentials: true,
  })
);

修改后,不带Origin头的请求会直接被CORS中间件拦截,大部分非浏览器工具的默认请求就无法通过了。

二、User-Agent验证的可行性与实现

User-Agent可以作为额外的安全校验手段,但要明确:User-Agent是可以被伪造的,它只能用来增加攻击成本,不能单独作为核心安全措施,必须和CORS等机制配合使用。

具体实现方法

编写自定义中间件,校验请求的User-Agent头是否包含主流浏览器的标识:

// 自定义User-Agent验证中间件
const validateUserAgent = (req, res, next) => {
  const userAgent = req.get('User-Agent');
  // 定义允许的浏览器标识关键词(覆盖主流浏览器)
  const allowedUaKeywords = [
    'Mozilla/',  // 所有Gecko内核浏览器(Chrome、Firefox等均包含)
    'AppleWebKit/', // Safari、Chrome等WebKit内核浏览器
    'Edge/' // Edge浏览器
  ];

  // 检查User-Agent是否包含允许的关键词
  const isLegitimate = allowedUaKeywords.some(keyword => userAgent?.includes(keyword));
  
  if (!isLegitimate) {
    return res.status(403).json({ message: 'Invalid request source' });
  }
  next();
};

// 将中间件挂载到需要保护的API路由
app.post("/api1", validateUserAgent, async (req, res) => {
  // 业务逻辑代码
});

app.post("/api2", validateUserAgent, async (req, res) => {
  // 业务逻辑代码
});

注意事项

  • 不要精确匹配完整的User-Agent字符串,不同浏览器、版本的User-Agent差异极大,用关键词匹配更稳定
  • 该方法只能拦截默认不带浏览器标识的工具,对于刻意伪造User-Agent的请求无效,必须结合其他安全措施

三、额外安全增强建议

  • 给API添加身份验证(如JWT、API密钥):这是最可靠的防护手段,即使绕过CORS和User-Agent校验,也能通过身份验证拦截非法请求
  • 限制请求频率:使用express-rate-limit中间件防止暴力攻击
  • 生产环境关闭错误栈输出:避免泄露服务器细节,降低被攻击的风险

内容的提问来源于stack exchange,提问作者Sergio Yael A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:53:03