Nginx “Access-Control-Allow-Origin” 安全配置

以下是Nginx中安全配置“Access-Control-Allow-Origin”头的实践指南:

一、避免使用通配符(*)

1. 精确指定允许的域名
通过白名单限制允许跨域的域名,避免使用Access-Control-Allow-Origin *,以减少CSRF等安全风险。
示例:

add_header Access-Control-Allow-Origin "https://example.com";

2. 动态匹配多个域名
使用map模块根据请求的Origin动态返回允许的域名,提升灵活性:

map $http_origin $cors_origin {
    default "";
    "~^https?://(example.com|sub.example.net)$" $http_origin;
}
server {
    location / {
        add_header Access-Control-Allow-Origin $cors_origin;
    }
}

二、限制允许的HTTP方法及头部

1. 明确允许的请求方法
仅开放必要的HTTP方法(如GET, POST),而非默认允许所有方法:

add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
?2. **指定允许的请求头?**
按需开放自定义或敏感头部(如Authorization),避免泛用配置?:
```nginx 
add_header Access-Control-Allow-Headers "Content-Type, Authorization";

三、预检请求(OPTIONS)处理

1. 返回204状态码
对OPTIONS请求直接返回204 No Content,避免触发实际业务逻辑68:

if ($request_method = 'OPTIONS') {
    return 204;
}

2. 避免重复添加头信息
确保在错误处理块(如error_page)中不重复设置跨域头,防止响应头冲突。

四、增强安全性补充配置

1. 控制凭据访问
若需携带Cookie等凭证,需显式设置Access-Control-Allow-Credentials并禁用通配符:

add_header Access-Control-Allow-Credentials "true";

2. 限制缓存时间
通过Access-Control-Max-Age减少预检请求频率,但需根据业务需求设置合理有效期(单位:秒):

add_header Access-Control-Max-Age 3600;

3. 添加Vary头
避免缓存因Origin不同导致的错误响应:

add_header Vary "Origin";

五、完整配置示例

map $http_origin $cors_origin {
    default "";
    "~^https?://(example.com|sub.example.net)$" $http_origin;
}

server {
    location / {
        if ($cors_origin) {
            add_header 'Access-Control-Allow-Origin' $cors_origin;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Vary' 'Origin';
        }

        if ($request_method = 'OPTIONS') {
            return 204;
        }
    }
}

以上配置通过动态域名匹配、严格限制方法/头部、正确处理预检请求及补充安全头,实现既灵活又安全的CORS策略15。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值