在Nginx反向代理中实现基于设备及浏览器指纹的访问控制(ACL)可以通过多种方式实现。以下是几种常见的配置方法:
http {
map $http_user_agent $blocked_agent {
default 0;
"~*bot|crawler|spider" 1;
"~*curl|wget" 1;
"~*Firefox/(3\.|4\.)" 1; # 阻止旧版Firefox
}
server {
if ($blocked_agent) {
return 403;
}
}
}
load_module modules/ngx_http_browser_module.so;
http {
browser $modern_browser {
msie 6.0;
firefox 2.0;
opera 9.0;
safari 3.0;
konqueror 3.0;
}
server {
if ($modern_browser) {
return 403 "Your browser is too old";
}
}
}
location /fingerprint {
# 处理前端发送的指纹数据
proxy_pass http://fingerprint_backend;
}
map $cookie_fingerprint $valid_fingerprint {
default 0;
"~*^[a-f0-9]{32}$" 1; # 简单MD5格式验证
}
server {
if ($valid_fingerprint = 0) {
return 403 "Invalid fingerprint";
}
}
location / {
access_by_lua_block {
local headers = ngx.req.get_headers()
local ua = headers["User-Agent"] or ""
local accept = headers["Accept"] or ""
local language = headers["Accept-Language"] or ""
-- 简单的指纹计算
local fingerprint = ngx.md5(ua .. accept .. language)
-- 检查指纹是否在黑名单中
local blacklist = {
"badfingerprint1234567890abcdef",
"anotherbadsignatureabcdef1234"
}
for _, v in ipairs(blacklist) do
if fingerprint == v then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
end
}
proxy_pass http://backend;
}
使用ModSecurity等WAF解决方案可以更全面地处理设备指纹:
location / {
ModSecurityEnabled on;
ModSecurityConfig modsecurity.conf;
proxy_pass http://backend;
}
在ModSecurity规则中配置指纹检测规则。
http {
# 设备指纹黑名单
map $http_user_agent $bad_device {
default 0;
"~*bot|crawler|spider" 1;
"~*curl|wget" 1;
"~*Android.*Mobile" 1; # 阻止移动设备
}
# 浏览器指纹验证
map $cookie_client_fingerprint $valid_fingerprint {
default 0;
"~*^[a-f0-9]{32}$" 1; # 32位哈希值
}
server {
listen 80;
server_name example.com;
# 静态资源用于收集指纹
location /fingerprint.js {
alias /path/to/fingerprint.js;
}
# 指纹提交端点
location /submit-fingerprint {
proxy_pass http://backend:8000/fingerprint;
}
location / {
# 设备检测
if ($bad_device) {
return 403 "Access denied for your device type";
}
# 指纹验证
if ($valid_fingerprint = 0) {
# 重定向到指纹收集页面
return 302 /fingerprint-page;
}
proxy_pass http://backend;
proxy_set_header X-Client-Fingerprint $cookie_client_fingerprint;
}
}
}
以上配置提供了多种基于设备和浏览器指纹的ACL控制方法,您可以根据实际需求选择适合的方案或组合使用多种方法。