使用XXXXX替换SQL查询文本中的参数

时间:2013-10-10 12:40:14

标签: java sql regex parsing

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

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

例如:

替换

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

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

3 个答案:

答案 0 :(得分:1)

正确答案取决于您想要更换多少。类似的东西:

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

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

regexpal.com

调整它并找出错误。

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

答案 1 :(得分: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中所有找到的String值。替换其他类型的数据,例如长值,覆盖ExpressionDeParser中的相应访问方法。

在这种情况下不要使用regexp。结果很快就难以维持。

答案 2 :(得分:0)

String sqlDebit = select * from table where和billing_cycle_start_date:startDate和:endDate

的java:

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