开发者社区> 问答> 正文

WallProvider 在WallVisitor处理之后会加入到LRUCache whiteLis

检测的代码

// first step, check whiteList boolean mulltiTenant = config.getTenantTablePattern() != null && config.getTenantTablePattern().length() > 0; if (!mulltiTenant) { WallCheckResult checkResult = checkWhiteAndBlackList(sql); if (checkResult != null) { checkResult.setSql(sql); return checkResult; } }

----------省略代码--------------------

WallVisitor visitor = createWallVisitor(); visitor.setSqlEndOfComment(endOfComment);

    if (statementList.size() > 0) {
        boolean lastIsHint = false;
        for (int i=0; i<statementList.size(); i++) {
            SQLStatement stmt = statementList.get(i);
            if ((i == 0 || lastIsHint) && stmt instanceof MySqlHintStatement) {
                lastIsHint = true;
                continue;
            }
            try {
                stmt.accept(visitor);
            } catch (ParserException e) {
                violations.add(new SyntaxErrorViolation(e, sql));
            }
        }
    }

------------------省略代码----------------------- 下面的代码会将执行的sql加入到一个白名单缓存中,加入到sql在第二次处理时不会再经过WallVisitor的处理,缓存进去的sql也不是经过WallVisitor处理后的sql,所以在配置了最大查询条数(selectLimit)时,就不生效了

WallSqlStat sqlStat = null; if (violations.size() > 0) { violationCount.incrementAndGet();

        if ((!updateCheckHandlerEnable) && sql.length() < MAX_SQL_LENGTH) {
            sqlStat = addBlackSql(sql, tableStat, context.getFunctionStats(), violations, syntaxError);
        }
    } else {
        if ((!updateCheckHandlerEnable) && sql.length() < MAX_SQL_LENGTH) {
            sqlStat = addWhiteSql(sql, tableStat, context.getFunctionStats(), syntaxError);
        }
    }

原提问者GitHub用户vinartis

展开
收起
山海行 2023-07-05 18:10:50 92 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    WallProvider 和 WallVisitor 是阿里云开源的 SQL 解析和语法分析工具,用于检测和防范 SQL 注入攻击。LRUCache 是一种缓存机制,用于提高数据访问的速度和效率。WhiteList 是 LRUCache 中的一种机制,用于存储可以直接访问的数据,以避免每次访问时都进行解析和处理。

    根据您的描述,您的问题是关于 WallProvider 和 WallVisitor 在 LRUCache WhiteList 中的问题。具体来说,问题是在 WallVisitor 处理 SQL 语句之后,WallProvider 会被加入到 LRUCache 的 WhiteList 中。

    这种行为是 WallFilter 的正常工作方式。在处理 SQL 语句时,WallVisitor 检测和解析 SQL 语句,然后生成相应的 AST(抽象语法树)。AST 会被传递给 WallProvider 进行进一步的分析和处理。在处理完成后,WallProvider 会被加入到 LRUCache 的 WhiteList 中,以避免重复的解析和处理。

    2023-07-30 20:09:58
    赞同 展开评论 打赏
  • 问题已修复,请用新版本

    https://github.com/alibaba/druid/releases/tag/1.2.5

    原回答者GitHub用户wenshao

    2023-07-06 10:48:06
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载