【问题标题】:Replace Parameters in SQL query text with XXXXX将 SQL 查询文本中的参数替换为 XXXXX
【发布时间】:2013-10-10 12:40:13
【问题描述】:

我正在编写一个小型实用程序来捕获和记录 SQL 语句,但必须从查询文本中删除敏感数据并替换为一些虚拟文本(即:XXXXX)。

java中解析SQL查询并替换参数值的好方法是什么?

例如:

替换

SELECT NAME, ADDRESS, .... FROM USER WHERE SSN IN ('11111111111111', '22222222222222');

SELECT NAME, ADDRESS, .... FROM USER WHERE SSN IN (?, ?);

【问题讨论】:

  • 使用像jsqlparser这样的sql解析器..不要使用正则表达式..要涵盖的情况太多,正则表达式会使您的代码复杂化..
  • 你用什么数据库
  • @Anirudh,你能发表你的评论作为答案,这样我就可以接受了:)
  • 也许 p6spy 也可以提供帮助,但我找不到他们的页面(尽管您仍然可以从 sourceforge 下载它)

标签: java sql regex parsing


【解决方案1】:

使用 JSQLParser (V0.8.9) 可以解决您的问题:

String sql ="SELECT NAME, ADDRESS, COL1 FROM USER WHERE SSN IN ('11111111111111', '22222222222222');";
Select select = (Select) CCJSqlParserUtil.parse(sql);

//Start of value modification
StringBuilder buffer = new StringBuilder();
ExpressionDeParser expressionDeParser = new ExpressionDeParser() {

    @Override
    public void visit(StringValue stringValue) {
        this.getBuffer().append("XXXX");
    }

};
SelectDeParser deparser = new SelectDeParser(expressionDeParser,buffer );
expressionDeParser.setSelectVisitor(deparser);
expressionDeParser.setBuffer(buffer);
select.getSelectBody().accept(deparser);
//End of value modification 

System.out.println(buffer.toString());
//Result is: SELECT NAME, ADDRESS, COL1 FROM USER WHERE SSN IN (XXXX, XXXX)

这将替换 SQL 中所有找到的字符串值。替换其他类型的数据,例如长值,覆盖ExpressionDeParser中对应的访问方法。

在这种情况下不要使用正则表达式。很快就证明它很难维护。

【讨论】:

    【解决方案2】:

    正确答案取决于您要更换多少。比如:

    [0-9]{3}-?[0-9]{2}-?[0-9]{4}
    

    将很好地取代社会安全号码。我总是把正则表达式代码带到

    regexpal.com

    调整它并解决错误。

    如果您需要替换大量敏感信息,并且在很多情况下,一定要开始考虑使用解析器来解析 SQL 查询字符串。 (如 jsqlparser,正如 Anirudh 推荐的那样。)

    【讨论】:

      【解决方案3】:

      String sqlDebit = select * from table where and billing_cycle_start_date 介于 :startDate 和 :endDate 之间

      java:

      sqlDebit= sqlDebit.replaceAll(":startDate", ""+startDate).replaceAll(":endDate", ""+endDate);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-17
        • 2014-03-30
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多