CORS 配置写成什么样才算安全?带 cookie 的接口能用通配符吗?用正则匹配来源要注意什么?CORS 能挡住 curl 吗?这篇只检查响应头:对几种配置分别发不同的 Origin,看服务端回什么。
[origins 不写(默认 *)]
Origin: https://app.example.com → {'Access-Control-Allow-Origin': 'https://app.example.com', 'Vary': 'Origin'}
Origin: https://other.test → {'Access-Control-Allow-Origin': 'https://other.test', 'Vary': 'Origin'}
Origin: null → {'Access-Control-Allow-Origin': 'null', 'Vary': 'Origin'}
[origins="*" + supports_credentials=True]
Origin: https://app.example.com → {'Access-Control-Allow-Origin': 'https://app.example.com', 'Access-Control-Allow-Credentials': 'true', 'Vary': 'Origin'}
Origin: https://other.test → {'Access-Control-Allow-Origin': 'https://other.test', 'Access-Control-Allow-Credentials': 'true', 'Vary': 'Origin'}
Origin: null → {'Access-Control-Allow-Origin': 'null', 'Access-Control-Allow-Credentials': 'true', 'Vary': 'Origin'}
[origins=[自己的前端]]
Origin: https://app.example.com → {'Access-Control-Allow-Origin': 'https://app.example.com'}
Origin: https://other.test → {}
Origin: null → {}
[origins=[自己的前端] + supports_credentials]
Origin: https://app.example.com → {'Access-Control-Allow-Origin': 'https://app.example.com', 'Access-Control-Allow-Credentials': 'true'}
Origin: https://other.test → {}
Origin: null → {}上一篇:Host Header 校验;下一篇:Rate Limiting。
第 79 篇与第 112 篇在真实浏览器里验证过 CORS 与预检,这一篇只看响应头与配置边界。
[r"https://.*example.com"(不严)]
https://app.example.com → 放行
https://evilexample.com → 放行
https://app.example.com.other.test → 放行
http://app.example.com → 拒绝
https://sub.app.example.com → 放行
[r"https://app\.example\.com$"(锚定)]
https://app.example.com → 放行
https://evilexample.com → 拒绝
https://app.example.com.other.test → 拒绝
http://app.example.com → 拒绝
https://sub.app.example.com → 拒绝
[r"https://([a-z0-9-]+\.)?example\.com$"(允许子域)]
https://app.example.com → 放行
https://evilexample.com → 拒绝
https://app.example.com.other.test → 拒绝
http://app.example.com → 拒绝
https://sub.app.example.com → 拒绝 Origin 不在名单: 200 {'ok': True} | 有没有 Allow-Origin: False
根本不带 Origin(curl、服务器到服务器): 200 {'ok': True} Origin=app → {'Access-Control-Allow-Origin': 'https://app.example.com', 'Vary': 'Origin'}
Origin=admin → {'Access-Control-Allow-Origin': 'https://admin.example.com', 'Vary': 'Origin'} /api/x {'Access-Control-Allow-Origin': 'https://app.example.com'}
/admin/y {}
预检请求 DELETE /api/x(只允许 GET)→ 200 {'Access-Control-Allow-Origin': 'https://app.example.com'}