2016-08-30 1 views
0

데이터베이스에 Java 문자열 풀 입력을 방지해야하는 몇 가지 중요한 필드가 있습니다. 데이터베이스의 VARCHAR은 모두 VARCHAR이며, 코드에서 StringBuilders를 사용하여 상수 풀에 넣지 않도록합니다.mybatis varchar가 java의 문자열 풀에 들어가는 것을 방지하려면 어떻게해야합니까?

우리는 데이터베이스와 상호 작용하기 위해 MyBatis를 사용하며 현재 setObject를 사용하여 StringBuilder를 Varchar에 매핑하려고 시도하는 타입 핸들러를 구현하려고합니다.

만약 가능하다면 MyBatis와 JDBC 사이에 다른 영역이 생겨서 String 풀에서 끝나지 않는 VARCHAR이 보장되지 않는다는 것을 알고 싶습니다.

나는뿐만 아니라 MyBatis로 사용자 구글 그룹에 질문을했지만 지금까지 아무도이

편집을 도울 수 없었다 (캐스트는 코드에서, 문, 문자열로 그런 종류의를 예정) - 이것은 문자열 풀에 대한 것이 아니라 데이터가 힙에있는 곳을 제어하고 가능한 한 빨리 null을 덮어 쓰는 방식으로 변경 가능한 CharSequence의 데이터를 지우는 것에 관한 것임을 분명히해야합니다. 문자열은 절대적으로 풀에 들어갈 수 없지만 단순히 풀에없는 문자열을 null로 설정하면 가비지 수집이 작동하는 방식으로 인해 보안 문제가 발생할 수 있습니다.

+0

String입니다. 그래서 나는 당신이 이것에 대해 걱정해야한다고 생각하지 않습니다. – talex

+0

모범 사례에 따르면 문자열이 힙에 있는지 확인하고 가능한 한 빨리 덮어 쓰도록해야합니다. 즉, 상수 풀에없는 경우에도 즉시 덮어 쓰지 않는 참조가있는 경우에도 힙 덤프가 있으면 문제가 발생합니다 생성됩니다. null로 설정되어있는 경우 가비지 콜렉션이 작동하는 방식으로 인해 여전히 존재할 수 있습니다. – SMC

+0

이 경우 데이터를 간단하게 덮어 쓸 수 있기 때문에'char []'을 사용하는 것이 더 좋습니다. 그리고 나는 그런 높은 보안 수준으로 일하지 않기 때문에 조금 질투합니다. – talex

답변

2

도움이 될지 모르지만 여기에 나와 있습니다.

첫째, 이 열을 처리하기 위해 (org.apache.ibatis.type.BaseTypeHandler 또는 이 org.apache.ibatis.type.TypeHandler를 구현 확장) TypeHandler 고객을 만들 수 있습니다. 대신 문자열 구현에 "표준"VARCHAR의

:

@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 인터페이스를 구현하면, 당신이 당신의 타입 핸들러와 을 등록해야합니다 원하는 열에 맞게 구성하십시오. 여기

는 호출 된 코드 또는`intern` 방법 일정한 경우에만 문자열 PUL에 끝날 것 reference page

+0

덕분에 typehandler가 도움이 될 때까지 도움이되었지만 characterstream과 비슷한 것을했지만 지금은 setter가 호출 될 때 잘못된 열 유형 예외가 발생하는 이유를 알아 내야 만합니다. – SMC

+0

다른 스택 오버플로 문제를 고려하십시오. 또한 문제 해결 기술로 setter 매개 변수의 유형을 Object로 변경 한 다음 매개 변수 클래스 이름을 인쇄하십시오. 예를 들어,'public void setterName (final Object newValue) {System.out.println (newValue.getClass(). getName()); }' – DwB

관련 문제