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

如何保护无认证的开放API端点,仅允许自有应用服务器请求?

针对无认证API的专属访问防护方案

以下是几种实用的方案,可让你的API仅识别并响应来自指定应用服务器的请求:

  • IP白名单拦截
    在API服务器的防火墙、反向代理(如Nginx)层面配置白名单,只放行你应用服务器的公网/内网IP。

    • Nginx配置示例:
      server {
          listen 80;
          server_name your-api-domain.com;
      
          location / {
              allow 10.0.0.5; # 你的应用服务器内网/公网IP
              deny all;
              proxy_pass http://your-api-backend;
          }
      }
      
    • 优势:实现简单,性能损耗极低,直接在网络层阻断非法请求;
    • 局限:若应用服务器是动态IP,需频繁更新白名单;多节点部署时要维护全量IP列表。
  • 自定义密钥请求头验证
    让应用服务器发起请求时携带一个仅你知晓的自定义请求头(如X-App-Auth-Key),API服务器先校验该头的内容是否匹配预设密钥。

    • Node.js API校验示例:
      app.use((req, res, next) => {
          const authKey = req.headers['x-app-auth-key'];
          if (authKey !== 'your-unique-secret-key-123') {
              return res.status(403).send('Forbidden');
          }
          next();
      });
      
    • 优势:不受IP变动影响,只要两端共享密钥即可;可搭配IP白名单实现双重防护;
    • 局限:密钥泄露会导致防护失效,务必确保API与应用服务器间用HTTPS传输,避免密钥被中间人窃取。
  • 私有网络内的身份标识
    如果API和应用服务器处于同一私有网络(如云服务商VPC),可直接用内网IP白名单,或在私有反向代理层给内部请求添加专属标记,API仅识别带有该标记的请求。

    • 优势:私有网络内请求无需暴露公网,安全性更高;无需额外密钥管理;
    • 局限:依赖云服务商的私有网络配置,跨地域部署时复杂度较高。
  • 请求签名验证
    比自定义头更安全的方案:应用服务器对请求路径、时间戳、随机串等关键信息用密钥生成哈希签名,API服务器收到请求后用相同规则重新计算签名并比对。

    • 应用端生成签名(Python示例):
      import hmac
      import hashlib
      import time
      
      secret = b'your-private-sign-key'
      timestamp = str(int(time.time()))
      request_path = '/api/get-data'
      sign_content = f"{timestamp}{request_path}".encode()
      signature = hmac.new(secret, sign_content, hashlib.sha256).hexdigest()
      
      # 携带签名和时间戳发起请求
      headers = {
          'X-Sign-Timestamp': timestamp,
          'X-Request-Sign': signature
      }
      
    • API端校验(Python示例):
      import hmac
      import hashlib
      import time
      
      def check_signature(req):
          secret = b'your-private-sign-key'
          timestamp = req.headers.get('X-Sign-Timestamp')
          signature = req.headers.get('X-Request-Sign')
          path = req.path
      
          # 验证时间戳,防止重放攻击(允许5分钟内的请求)
          if abs(int(time.time()) - int(timestamp)) > 300:
              return False
      
          sign_content = f"{timestamp}{path}".encode()
          expected_sign = hmac.new(secret, sign_content, hashlib.sha256).hexdigest()
          return hmac.compare_digest(signature, expected_sign)
      
    • 优势:能抵御重放攻击,即使请求被窃取,过期后也无法复用;安全性远高于简单密钥头;
    • 局限:实现相对复杂,需确保两端时间同步、签名算法完全一致。

内容的提问来源于stack exchange,提问作者Siddhartha Choubey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:30:57