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

正解は、交換したい量によって異なります。何かのようなもの:

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

社会保障番号をかなりうまく置き換えます。私は常に正規表現コードを取ります

regexpal.com

それを微調整してバグを解決します。

ただし、大量の機密情報を置き換える必要があり、多くの場合がある場合は、パーサーを使用して SQL クエリ文字列を解析することを検討してください。(Anirudh が推奨する jsqlparser など)。

于 2013-10-28T20:37:19.183 に答える
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 値など) を置き換えるには、対応する visit メソッドを でオーバーライドしますExpressionDeParser

この場合、正規表現を使用しないでください。メンテナンスが難しいことがすぐにわかります。

于 2014-02-06T00:13:52.503 に答える