我正在编写一个捕获和记录SQL语句的小工具,但必须从查询文本中删除敏感数据,并用一些虚拟文本替换(即:XXXXX)。
在java中解析SQL查询并替换参数值有什么好方法?
例如:
替换
SELECT NAME, ADDRESS, .... FROM USER WHERE SSN IN ('11111111111111', '22222222222222');
与
SELECT NAME, ADDRESS, .... FROM USER WHERE SSN IN (?, ?);
答案 0 :(得分:1)
正确答案取决于您想要更换多少。类似的东西:
[0-9]{3}-?[0-9]{2}-?[0-9]{4}
将很好地取代社会保障号码。我总是把正则表达式代码带到
调整它并找出错误。
如果您需要替换大量的敏感信息,并且如果有很多情况,那么一定要开始考虑使用解析器来解析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);