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
相关产品推荐
相关产品推荐

