本文目录导读:

- 核心原则:优先级由“谁先被匹配”决定
- 方法一:Shell/Bash 脚本(基于顺序)
- 方法二:Python 脚本(基于权重值)
- 方法三:JavaScript/Node.js(正则优先级)
- 方法四:通用设计模式(黑/白灰名单结合)
- 总结:如何选择你的方案?
关于脚本白名单优先级设置,这个问题的具体实现取决于你使用的脚本环境(如 Shell、Python、Lua、JavaScript 等)以及应用场景(如服务器访问控制、游戏脚本、自动化任务等)。
由于你没有指定具体环境,我将提供最通用、最高效的几种设计模式和实现方法,你可以直接套用到你的项目中。
核心原则:优先级由“谁先被匹配”决定
白名单的核心通常是 模式匹配,设置优先级最直接的方法是:
- 顺序优先:将优先级高的规则放在列表前面。
- 精确覆盖模糊:精确匹配的规则拥有最高优先级。
- 权重值:为每条规则设定一个权重数字,权重高者优先。
Shell/Bash 脚本(基于顺序)
这是最常见的场景,比如设置 IP 白名单、命令白名单。
场景:允许某些 IP 访问,但拒绝特定子网。
#!/bin/bash
# 白名单规则列表,越靠前优先级越高
WHITELIST=(
"192.168.1.100" # 完全允许这个IP (优先级最高)
"192.168.1.0/24" # 允许这个网段 (次高)
"10.0.0.0/8" # 允许另一个大网段 (最低)
)
# 要检查的IP
CHECK_IP="192.168.1.100"
allowed=false
for rule in "${WHITELIST[@]}"; do
# 检查IP是否匹配当前规则
if ipcalc -c "$CHECK_IP" "$rule" > /dev/null 2>&1; then
echo "匹配规则: $rule"
allowed=true
break # 一旦匹配优先级最高的规则,立即停止检查
fi
done
if $allowed; then
echo "允许访问"
else
echo "拒绝访问"
fi
关键点:使用 break 或 return 在匹配成功后立即退出循环,利用“顺序”作为优先级。
Python 脚本(基于权重值)
Python 适合处理复杂的、需要动态调整优先级的逻辑。
场景:一个自动化脚本,需要根据用户、操作、来源进行精细控制。
# 规则定义:每条规则是一个字典,包含条件、动作和权重
white_list_rules = [
{"user": "admin", "action": "delete", "source": "*", "allow": True, "priority": 100},
{"user": "*", "action": "read", "source": "internal_network", "allow": True, "priority": 50},
{"user": "guest", "action": "*", "source": "*", "allow": False, "priority": 10}, # 拒绝所有
]
def check_access(user, action, source):
# 按优先级从高到低排序
sorted_rules = sorted(white_list_rules, key=lambda x: x["priority"], reverse=True)
for rule in sorted_rules:
# 检查是否匹配:通配符 * 表示匹配所有
user_match = (rule["user"] == user or rule["user"] == "*")
action_match = (rule["action"] == action or rule["action"] == "*")
source_match = (rule["source"] == source or rule["source"] == "*")
if user_match and action_match and source_match:
print(f"匹配规则(优先级{rule['priority']}): {rule}")
return rule["allow"]
# 默认拒绝
return False
# 测试
result = check_access("admin", "delete", "anywhere") # 应返回 True
print(result)
关键点:
- 每条规则有一个
priority字段。 - 每次检查时,先对规则按优先级排序。
- 遍历时匹配的第一个规则就是最高优先级规则。
JavaScript/Node.js(正则优先级)
适合 Web 应用的请求拦截或 API 路由白名单。
场景:限制可访问的脚本路径。
// 白名单规则,支持正则表达式,优先级顺序排列
const whitelist = [
{ pattern: /^\/public\/.*$/, allow: true, priority: 1 }, // 公开目录
{ pattern: /^\/admin\/superuser\/.*$/, allow: true, priority: 10 }, // 超级管理员路径
{ pattern: /^\/admin\/.*$/, allow: false, priority: 5 }, // 普通管理员路径不开放
];
function checkPermission(url) {
// 按优先级降序排列
whitelist.sort((a, b) => b.priority - a.priority);
for (const rule of whitelist) {
if (rule.pattern.test(url)) {
console.log(`URL ${url} 匹配规则: ${rule.pattern}`);
return rule.allow;
}
}
// 默认拒绝
return false;
}
// 测试
console.log(checkPermission("/admin/superuser/config")); // 应输出 true
console.log(checkPermission("/admin/settings")); // 应输出 false
通用设计模式(黑/白灰名单结合)
在实际项目中,仅靠“放行”的白名单不够灵活,推荐使用 “优先级过滤链”。
黑名单 (最高优先级) - 直接拒绝 2. 白名单 (中间优先级) - 放行,但受限制 3. 管理员名单 (特殊优先级) - 完全放行,无需审计 4. 默认策略 (最低优先级) - 拒绝所有人
伪代码逻辑:
if is_blacklisted(user): return "拒绝" // 优先级 100 if is_whitelisted(user): return "放行" // 优先级 50 if is_admin_whitelist(user): return "完全放行" // 优先级 60 else: return "拒绝" // 默认
在这个逻辑中,is_blacklisted 虽然优先级最高,但它的作用是 否决。
如何选择你的方案?
| 你的场景 | 推荐方法 | 原因 |
|---|---|---|
| 命令行脚本、服务器配置 | 方法一 (顺序优先) | 简单直接,与 iptables 规则风格一致 |
| 复杂自动化 (Python/Java) | 方法二 (权重值) | 灵活性最高,易于动态管理和组合 |
| Web 前端/后端 API | 方法三 (正则+排序) | 支持复杂的路径和参数匹配 |
| 需要多层次安全 | 方法四 (黑白灰名单) | 防止误判,兼顾安全与便利 |
如果你能提供具体的脚本语言和白名单的用途(防爬虫、限制玩家指令、服务器访问控制),我可以给你一个完全定制化的代码示例。