2016-08-30 2 views
0

Wir haben mehrere sensible Felder in unserer Datenbank, von denen verhindert werden muss, dass sie in den Java-String-Pool gelangen. Alle sind VARCHAR in der Datenbank und wir verwenden StringBuilders in unserem Code, um zu verhindern, dass sie in den Konstantenpool eingefügt werden.Wie verhindert man, dass ein mybatis varchar den String-Pool in Java eingibt?

Wir verwenden MyBatis, um mit der Datenbank zu interagieren, und ich versuche gerade, einen Typhandler zu implementieren, den ich versuche, SetObject zu verwenden, um StringBuilder zu Varchar zuzuordnen.

Ich frage mich, ob dies möglich ist und, wenn es ist, gibt es andere Bereiche zwischen MyBatis und JDBC, die bedeuten, dass der VARCHAR nicht im String-Pool endet nicht garantiert werden kann? (Casts im Code, kommen Aussagen wie Saiten, diese Art der Sache)

Ich habe auch die Frage nach der Mybatis-Benutzer Google-Gruppe gefragt, aber bisher niemand in der Lage war, dort zu helfen

bearbeiten - Ich sollte klarstellen, dass es nicht ausschließlich um den String-Pool geht, sondern darum, die Daten auf dem Heap zu kontrollieren und die Daten aus der veränderbaren CharSequence so schnell wie möglich durch Überschreiben mit Nullen zu löschen. Die Zeichenfolgen können absolut nicht in den Pool eingegeben werden, aber das einfache Nullen einer Zeichenfolge, die sich nicht im Pool befindet, kann aufgrund der Funktionsweise der Speicherbereinigung weiterhin zu Sicherheitsproblemen führen.

+0

String wird nur in String pul am Ende, wenn es im Code oder 'intern' Methode konstant genannt wurde. Ich denke nicht, dass du dir deswegen Sorgen machen musst. – talex

+0

Gemäß den Best Practices sollten Sie sicherstellen, dass die Zeichenfolge in etwas auf dem Heap ist und so schnell wie möglich überschrieben wird. Selbst wenn es nicht im Konstantenpool ist, wenn ein Verweis nicht sofort überschrieben wird, verursacht es dennoch Probleme, wenn ein Heapdump ist erzeugt. Wenn es auf null gesetzt ist, kann es aufgrund der Funktionsweise der Speicherbereinigung immer noch vorhanden sein – SMC

+0

In diesem Fall verwenden Sie besser 'char []', da Sie Daten einfach überschreiben können. Und ich bin auch wenig eifersüchtig, weil ich nie mit so hohen Sicherheitsstufen arbeite. – talex

Antwort

2

Nicht sicher, dass dies helfen wird, aber hier geht.

Erstellen Sie zunächst ein Kunde typehandler (verlängern org.apache.ibatis.type.BaseTypeHandler oder org.apache.ibatis.type.TypeHandler implementieren) Ihre Spalte zu behandeln.

Anstelle des "Standard" varchar zu String Umsetzung:

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

implementieren diese

@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; 
} 

Sobald Sie die gesamte TypeHandler-Schnittstelle implementieren, Sie müssen Ihren Typ-Handler registrieren und Konfigurieren Sie es für die gewünschte Spalte.

Hier ist ein reference page

+0

Danke, es hilft, soweit der Typhandler geht, habe ich etwas ähnliches, aber mit Characterstream, jetzt muss ich nur herausfinden, warum ich ungültige Spalte Typ Ausnahmen erhalten, wenn Setter – SMC

+0

eine andere Stapelüberlauf Frage betrachten. Ändern Sie als Fehlerbehebungsmethode auch den Typ Ihres Setter-Parameters in "Object" und drucken Sie dann den Namen der Parameterklasse. zum Beispiel 'public void setterName (endgültiges Objekt newValue) {System.out.println (neueValue.getClass(). getName()); } ' – DwB

Verwandte Themen