跨域漏洞处理: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
变量。