regex 将SQL查询文本中的参数替换为XXXXX

qmelpv7a  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(187)

我正在写一个捕获和记录SQL语句的小工具,但是必须从查询文本中删除敏感数据,并替换为一些伪文本(即:XXXXX)。
在java中解析SQL查询并替换参数值的好方法是什么?
例如:
取代了

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

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

fdx2calv1#

使用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中相应的访问方法。
在这种情况下不要使用regexp,因为它很快就会变得很难维护。

omvjsjqw

omvjsjqw2#

正确答案取决于你想更换多少。比如:

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

我会很好地取代社会安全号码。我总是用正则表达式代码来
regexpal.com
来调整它并解决问题。
如果您需要替换大量的敏感信息,并且如果有很多情况,一定要开始考虑使用解析器来解析SQL查询字符串。(如Anirudh推荐的jsqlparser。)

roqulrg3

roqulrg33#

字符串sqlDebit =从表中选择 *,其中和billing_cycle_start_date介于:startDate和:endDate之间
Java语言:
如果您有任何问题,请联系我们。如果您有问题,请联系我们。

fdbelqdn

fdbelqdn4#

使用prepare语句,您可以将查询字符串中的“?”替换为您的值。使用数字指定您所引用的“?”。它们按从右到左的顺序排列。
例如:“SELECT姓氏,名字FROM人员.联系人WHERE姓氏=?与名字=?”
“最后一个名称值”;(2,“名字值”);参见以下完整示例:

public static void executeStatement(Connection con) {
        try(PreparedStatement pstmt = con.prepareStatement("SELECT LastName, FirstName FROM Person.Contact WHERE LastName = ?");) {
            pstmt.setString(1, "Smith");
            ResultSet rs = pstmt.executeQuery();
    
            while (rs.next()) {
                System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
            }
        }
        // Handle any errors that may have occurred.
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

相关问题