脚本如何设置白名单优先级

wen 实用脚本 32

本文目录导读:

脚本如何设置白名单优先级

  1. 核心原则:优先级由“谁先被匹配”决定
  2. 方法一:Shell/Bash 脚本(基于顺序)
  3. 方法二:Python 脚本(基于权重值)
  4. 方法三:JavaScript/Node.js(正则优先级)
  5. 方法四:通用设计模式(黑/白灰名单结合)
  6. 总结:如何选择你的方案?

关于脚本白名单优先级设置,这个问题的具体实现取决于你使用的脚本环境(如 Shell、Python、Lua、JavaScript 等)以及应用场景(如服务器访问控制、游戏脚本、自动化任务等)。

由于你没有指定具体环境,我将提供最通用、最高效的几种设计模式和实现方法,你可以直接套用到你的项目中。


核心原则:优先级由“谁先被匹配”决定

白名单的核心通常是 模式匹配,设置优先级最直接的方法是:

  1. 顺序优先:将优先级高的规则放在列表前面。
  2. 精确覆盖模糊:精确匹配的规则拥有最高优先级。
  3. 权重值:为每条规则设定一个权重数字,权重高者优先。

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

关键点:使用 breakreturn 在匹配成功后立即退出循环,利用“顺序”作为优先级。


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 方法三 (正则+排序) 支持复杂的路径和参数匹配
需要多层次安全 方法四 (黑白灰名单) 防止误判,兼顾安全与便利

如果你能提供具体的脚本语言白名单的用途(防爬虫、限制玩家指令、服务器访问控制),我可以给你一个完全定制化的代码示例。

抱歉,评论功能暂时关闭!