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

Cloudflare Pages函数端点访问限制失效问题排查

解决Cloudflare Pages函数Origin校验不生效的问题

你的代码里Origin校验失效主要有两个核心问题,还有可以补充的安全增强手段:

1. Origin值获取错误

你用context.origin拿到的是函数部署的域名,而不是请求发起方的Origin头。正确的做法是从请求头里获取Origin:

const origin = context.request.headers.get('Origin');

2. 未处理Origin为空的场景

同域请求(比如你的Pages应用直接调用同域名下的函数端点)不会携带Origin头,这时候origin会是null,直接判断等于你的域名会导致合法请求被拦截。需要把null加入允许列表,或者结合Referer头做补充校验。

修正后的示例代码

export async function onRequest(context) {
  const { request, env } = context;
  const origin = request.headers.get('Origin');
  const referer = request.headers.get('Referer');
  
  // 允许的来源:指定域名 + 同域请求(Origin为null)
  const allowedOrigins = ['https://xyz.pages.dev', null];
  // 结合Referer校验,避免Origin被伪造的情况
  const isFromAllowedDomain = allowedOrigins.includes(origin) || 
    (referer && referer.startsWith('https://xyz.pages.dev/'));

  if (isFromAllowedDomain) {
    const ps = env.XYZDB.prepare('SELECT * from costs');
    const data = await ps.all();

    return new Response(JSON.stringify(data), {
      headers: {
        'Content-Type': 'application/json',
        // 配置CORS头,避免前端跨域报错
        'Access-Control-Allow-Origin': origin || 'https://xyz.pages.dev',
        'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
        'Access-Control-Allow-Headers': 'Content-Type'
      },
    });
  } else {
    console.log('Unauthorized Request from Origin:', origin);
    return new Response('Unauthorized', { status: 401 });
  }
}

额外安全增强建议

仅靠Origin/Referer校验不够可靠,因为这些头可以被伪造,建议结合以下方式:

  • Authenticated Origin Pulls:在Cloudflare控制台配置后,只有经过Cloudflare转发的请求才能访问你的函数,确保请求来自你的Pages应用,避免外部直接调用函数端点
  • 自定义密钥校验:在前端请求时添加自定义头(比如X-APP-SECRET: your-secure-key),函数里校验该密钥是否匹配,这种方式比Origin校验更安全

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:57:28