0

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

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

例如:

代替

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

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

3 回答 3

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 中所有找到的字符串值。要替换其他类型的数据,例如 Long 值,请覆盖ExpressionDeParser.

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

于 2014-02-06T00:13:52.503 回答
1

正确答案取决于您要更换多少。就像是:

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

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

正则表达式.com

调整它并解决错误。

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

于 2013-10-28T20:37:19.183 回答
0

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

爪哇:

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

于 2017-05-17T02:21:20.077 回答