在另一个域名下写了十行 fetch 就读到了内网接口的数据,抓包看响应头,Access-Control-Allow-Origin 里写着自己那个测试域名,等于谁都能读。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
map $http_origin $cors_ok {
default 0;
'~^https://(www\.)?example\.com$' 1;
}
服务端图省事把请求里的 Origin 原样写回响应头,等于对全世界开放;接口一旦靠 Cookie 鉴权,任何站点都能带着用户凭据读数据,同源策略这道门槛形同虚设。这一点先确认清楚,后面就不用反复试。
「CORS Origin 反射」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。
具体做法是,白名单里的域名才回显,其余来源一律不输出任何 CORS 头;一律用精确匹配的方式,别用包含或者后缀去判断;接口侧同时校验 Origin 和 CSRF token,两项都对上才允许这个请求放行。
改完照着核一遍,白名单之外的 Origin 拿不到允许头,浏览器里就一个字段都读不到内容。
