跨域漏洞处理:Nginx 配置处理 CORS 请求

跨域漏洞处理:Nginx 配置处理 CORS 请求

目的

本文档描述了如何配置 Nginx 以处理跨源资源共享(CORS)请求,特别是如何处理合法和非法的 Origin 请求。配置中包括对合法白名单的 Origin 进行允许,返回 CORS 响应头,对非法或非白名单的 Origin 请求返回403错误。

背景

CORS 是一种浏览器安全特性,用于限制网页如何从不同源的服务器请求资源。在处理 CORS 请求时,我们需要确保只有合法的域名可以访问资源,同时对非法域名请求进行适当的处理,以防止潜在的安全漏洞。

配置步骤

1. 配置 map 指令

map 指令用于根据请求的 Origin 设置一个变量,以便后续处理。以下配置将请求的 Origin 映射到 $is_whitelisted 变量中,根据是否是白名单中的 Origin 进行标记。

http {
    # 映射 Origin 到是否是白名单中的标志
    map $http_origin $is_whitelisted {
        default "0";
        "~^http://127\.0\.0\.1:9004$" "1";
    }

    server {
        listen 80;

        location / {
            # 非白名单的 Origin 且不为空,返回 403 错误
            if ($is_whitelisted = "0") {
                if ($http_origin != "") {
                    return 403;
                }
            }

            # 白名单中的 Origin,添加 CORS 头
            if ($is_whitelisted = "1") {
                add_header Access-Control-Allow-Origin $http_origin;
                # 添加其他 CORS 头,例如:
                add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
                add_header Access-Control-Allow-Headers "Authorization, Content-Type";
            }

            # 其他配置
        }
    }
}
2. 配置详细说明
  • map 指令

    • $http_origin:请求头中的 Origin
    • $is_whitelisted:映射结果,标识 Origin 是否在白名单中。
    • default "0":未匹配到的 Origin 被标记为非白名单。
    • ~^http://127\.0\.0\.1:9004$:正则表达式用于匹配特定的白名单 Origin
  • location /

    • if ($is_whitelisted = "0"):检查 Origin 是否为非白名单。
      • if ($http_origin != ""):如果 Origin 不为空,则返回403错误。
    • if ($is_whitelisted = "1"):如果 Origin 在白名单中,添加 CORS 头部。
3. 处理非法 Origin
  • 非白名单中的 Origin 请求将被返回403错误,以防止非法访问。
  • 白名单中的 Origin 将允许访问,并且添加相应的 CORS 头,以便客户端能够处理跨源请求。

注意事项

  • 安全性:确保白名单中的 Origin 是受信任的,避免配置漏洞。
  • 性能:对于大量的 Origin 或复杂的匹配条件,map 指令提供了高效的解决方案。
  • 调试:配置变更后,建议使用 curl 或其他工具测试不同的 Origin,确保配置按预期工作。

参考文献


此文档提供了一个基本的配置示例,并解释了如何处理 CORS 请求以及如何根据不同的 Origin 进行不同的处理。根据实际情况,可以调整正则表达式和白名单配置。

~^http://127\.0\.0\.1:9004$ 是一个正则表达式,用于匹配完整的 URL 字符串。让我们详细解析一下这个正则表达式的每个部分:

  • ~:在 Nginx 中,~ 用于表示匹配一个正则表达式,并且这个匹配是大小写敏感的。~* 表示匹配时忽略大小写。
  • ^:表示字符串的开始。这意味着匹配从字符串的开头开始。
  • http://127\.0\.0\.1:9004:这是要匹配的实际字符串。127.0.0.1:9004 是 IP 地址和端口号。
    • \.:点号 . 在正则表达式中是一个特殊字符,表示匹配任意单个字符。因此,实际的点号 . 需要使用反斜杠 \ 转义为 \.
  • $:表示字符串的结束。这意味着匹配到字符串的末尾。

解释

  • ^http://127\.0\.0\.1:9004$:这个正则表达式将匹配整个字符串 http://127.0.0.1:9004,确保 URL 从开头到结尾完全符合这个模式。

示例

假设你有如下几种 Origin 值:

  • http://127.0.0.1:9004:匹配成功。
  • http://127.0.0.1:9004/some/path:不匹配(因为有额外的路径部分)。
  • http://127.0.0.1:9005:不匹配(端口号不同)。
  • http://another.domain.com:9004:不匹配(域名不同)。

实际应用

在 Nginx 的 map 指令中使用这个正则表达式可以帮助你精确地匹配特定的 Origin 值。例如,如果你只允许 http://127.0.0.1:9004 作为合法的 Origin,这个正则表达式确保了只允许这个特定的 URL 访问。

map $http_origin $is_whitelisted {
    default "0";
    "~^http://127\.0\.0\.1:9004$" "1";
}

这个配置将检查 $http_origin 是否完全匹配 http://127.0.0.1:9004,并相应地设置 $is_whitelisted 变量。

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了防止CORS漏洞,可以在Nginx服务器上进行以下设置: 1. 在Nginx配置文件中添加以下内容: ```nginx location / { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; if ($request_method = 'OPTIONS') { return 204; } } ``` 2. 在Nginx配置文件中添加以下内容,以允许特定的域名进行跨域请求: ```nginx location / { if ($http_origin ~* (http://localhost:8080|http://www.example.com)) { add_header 'Access-Control-Allow-Origin' "$http_origin"; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; } if ($request_method = 'OPTIONS') { return 204; } } ``` 3. 在Nginx配置文件中添加以下内容,以允许所有域名进行跨域请求: ```nginx location / { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; if ($request_method = 'OPTIONS') { return 204; } } ``` 4. 在Nginx配置文件中添加以下内容,以允许特定的域名进行跨域请求,并且允许特定的HTTP方法: ```nginx location / { if ($http_origin ~* (http://localhost:8080|http://www.example.com)) { add_header 'Access-Control-Allow-Origin' "$http_origin"; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; } if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; return 204; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值