0

データベースには、Java 文字列プールに入らないようにする必要がある機密フィールドがいくつかあります。データベースではすべて VARCHAR であり、コードで StringBuilders を使用して、それらが定数プールに入れられないようにします。

MyBatis を使用してデータベースと対話します。現在、setObject を使用して StringBuilder を Varchar にマップしようとしているタイプハンドラーを実装しようとしています。

これが可能かどうか疑問に思っています。可能であれば、MyBatis と JDBC の間に、VARCHAR が String プールに収まらないことを保証できないことを意味する他の領域がありますか? (コード内のキャスト、文字列としてのステートメント、そのようなもの)

mybatis-users Google グループでも質問しましたが、これまで誰も助けてくれませんでした

編集 - これは厳密には文字列プールに関するものではなく、データがヒープ上のどこにあるかを制御し、null で上書きすることによって可変 CharSequence からデータをできるだけ早く消去することであることを明確にする必要があります。文字列をプールに入れることは絶対にできませんが、プールにない文字列を null にするだけで、ガベージ コレクションの仕組みが原因でセキュリティの問題が発生する可能性があります。

4

1 に答える 1

2

これが役立つかどうかはわかりませんが、ここに行きます。

まず、列を処理するための顧客の TypeHandler (拡張org.apache.ibatis.type.BaseTypeHandlerまたは実装org.apache.ibatis.type.TypeHandler) を作成します。

「標準」の varchar から String への実装の代わりに:

@Override
public String getNullableResult(ResultSet rs, int columnIndex)
throws SQLException
{
    return rs.getString(columnIndex);
}

これを実装する

@Override
public StringBuilder getNullableResult(ResultSet rs, int columnIndex)
throws SQLException
{
    final StringBuilder returnValue = new StringBuilder();
    final byte[] value = rs.getbytes(columnIndex);

    // add the bytes to the StringBuilder.

    return returnValue;
}

インターフェイス全体を実装したらTypeHandler、型ハンドラーを登録し、目的の列用に構成する必要があります。

参考ページはこちら

于 2016-08-30T18:03:07.047 に答える