黑白名单

在waf多规则的基础上进行拦截请求,同时为其扩展了一种黑白名单类型。

规则黑名单

在添加规则时,规则默认为黑名单规则,也就是需要waf过滤的规则。

如常用的一些封禁ip,封禁爬虫等,可以配置header黑名单规则,ip黑名单规则,即可实现对流量的过滤

规则白名单

如果将添加的规则设置为白名单规则,waf过滤将优先处理白名单规则列表,一旦命中白名单列表,将跳过当前阶段剩余所有的规则,进而执行下阶段waf。

这里以API黑白名单为例,可以看到waf过滤时,是优先逐个处理白名单规则,继而处理黑名单规则

# 代码位置 : waf/tl_ops_waf_api.lua

local tl_ops_waf_core_api_filter_global_pass = function()
    -- 作用域
    local api_scope, _ = cache_api:get(tl_ops_constant_waf_api.cache_key.scope);
    if not api_scope then
        return true
    end

    -- 根据作用域进行waf拦截
    if api_scope ~= waf_scope.global then
        return true
    end

    -- 是否开启拦截
    local open, _ = cache_api:get(tl_ops_constant_waf_api.cache_key.open);
    if not open then
        return true
    end

    -- 配置列表
    local api_list, _ = cache_api:get(tl_ops_constant_waf_api.cache_key.list);
    if not api_list then
        return true
    end

    local api_list_table = cjson.decode(api_list);
    if not api_list_table then
        return true
    end

    -- 获取当前url
    local request_uri = tl_ops_utils_func:get_req_uri();
    if not request_uri then
        return true
    end

    local cur_host = ngx.var.host
    if not cur_host then
        return true
    end

    -- 优先处理白名单
    for _, api in ipairs(api_list_table) do
        repeat
            local value = api.value
            local host = api.host
            local white = api.white
            -- 非白名单跳过
            if not white then
                break
            end
            -- 域名为空跳过规则
            if host == nil or host == '' then
                break
            end
            -- 域名不匹配跳过规则
            if host ~= "*" and host ~= cur_host then
                break
            end
            -- 未命中拦截规则,进行下一个
            local res, _ = find(request_uri , value , 'joi');
            if not res then
                break
            end
            -- api白名单,不用后续比对,直接通过
            return true
        until true
    end

    ...

    return true
end