我正在编写一个捕获和记录 SQL 语句的小实用程序,但必须从查询文本中删除敏感数据并替换为一些虚拟文本(即:XXXXX)。
在java中解析SQL查询并替换参数值的好方法是什么?
例如:
代替
SELECT NAME, ADDRESS, .... FROM USER WHERE SSN IN ('11111111111111', '22222222222222');
和
SELECT NAME, ADDRESS, .... FROM USER WHERE SSN IN (?, ?);
使用 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.
在这种情况下不要使用正则表达式。事实证明,它很快就很难维护。
正确答案取决于您要更换多少。就像是:
[0-9]{3}-?[0-9]{2}-?[0-9]{4}
将很好地取代社会安全号码。我总是把正则表达式代码
调整它并解决错误。
但是,如果您需要替换大量敏感信息,并且在很多情况下,一定要开始研究使用解析器来解析 SQL 查询字符串。(例如 jsqlparser,正如 Anirudh 推荐的那样。)
String sqlDebit = select * from table where and billing_cycle_start_date 介于 :startDate 和 :endDate 之间
爪哇:
sqlDebit= sqlDebit.replaceAll(":startDate", ""+startDate).replaceAll(":endDate", ""+endDate);