secure coding java 질문이요..
- 작성자 :
- 문*덕
- 작성일 :
- 2015-02-05 23:23:30
- 조회수 :
- 1,032
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
수고 많으십니다..
프로젝트 막바지인데 자꾸 튀어나오네요..
Yasca 툴을 통해서 체크했는데 Class.forName("jdbc드라이버") 이 부분에서 문제가 나옵니다.
UseProperClassLoader 부분
참고 주소 http://pmd.sourceforge.net/pmd-4.3.0/rules/j2ee.html
아마 클래스를 직접 로드하기 때문에 변조의 가능성이 있는 것 같습니다.
참고주소 http://www.oracle.com/technetwork/java/seccodeguide-139067.html
Guideline 9-9 / ACCESS-9: Safely invoke standard APIs that perform tasks using the immediate caller's class loader instance
The following static methods perform tasks using the immediate caller's class loader:
java.lang.Class.forName
java.lang.Package.getPackage(s)
java.lang.Runtime.load
java.lang.Runtime.loadLibrary
java.lang.System.load
java.lang.System.loadLibrary
java.sql.DriverManager.deregisterDriver
java.sql.DriverManager.getConnection
java.sql.DriverManager.getDriver(s)
java.util.logging.Logger.getAnonymousLogger
java.util.logging.Logger.getLogger
java.util.ResourceBundle.getBundle
그래서 한참을 찾던 중에 싱글톤 방식으로 해결을 보았습니다.
http://arangluv.tistory.com/?page=2 (페이지검색으로 forName 하시면 됩니다)
코드는
public static Class<?> getDriver(String driver) throws ClassNotFoundException{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if( loader == null ){
loader = 현재클래스명.class.getClassLoader();
}
return loader.loadClass(driver);
}
이 메소드를 Class.forName("드라이버명") 으로 대체 시켰습니다. 즉 현재클래스명.getDriver("드라이버명") 식으로요.
그랬더니 loader = 현재클래스명.class.getClassLoader(); 이 부분이 생성 안할 가능성이 있다고 해서
Thread.currentThread().getContextClassLoader(); 이걸로 대체하라는 게 나오는데
위의 메소드를 보면 싱글톤 방식으로 Thread.currentThread().getContextClassLoader(); 로 loader 변수에 대입하고
만약 null 이라면 getClassLoader() 로 해서 사용해라 인 싱글톤 방식인 것 같은데요.
어떻게 해결해야 할지 모르겠습니다.
행정자치부의 시큐어 코딩 java 부분 pdf(98페이지) 를 보았는데요
문자열을 체크한 후에 해당 클래스를 new 클래스명(); 하더군요..(oracle jdbc 드라이버이기 때문에 예제처럼 파라미터로 받고 그러진 않습니다)
그렇다면 저도 위에처럼 loader 뭐 저런거 쓰지말고 new OracleDriver(); 를 생성하면 될까요?
물론 싱글톤 방식으로 생성해서 사용하면 될런지요?
import oracle.jdbc.driver.OracleDriver 임포트 하고 전역변수처리
private static OracleDriver dirver = new OracleDriver();
// 유일한 객체에 접근할 수 있는 정적 메서드 정의
public static OracleDriver getDriver(){
return dirver ;
}
상세한 답변 부탁드립니다. 수고하세요..
프로젝트 막바지인데 자꾸 튀어나오네요..
Yasca 툴을 통해서 체크했는데 Class.forName("jdbc드라이버") 이 부분에서 문제가 나옵니다.
UseProperClassLoader 부분
참고 주소 http://pmd.sourceforge.net/pmd-4.3.0/rules/j2ee.html
아마 클래스를 직접 로드하기 때문에 변조의 가능성이 있는 것 같습니다.
참고주소 http://www.oracle.com/technetwork/java/seccodeguide-139067.html
Guideline 9-9 / ACCESS-9: Safely invoke standard APIs that perform tasks using the immediate caller's class loader instance
The following static methods perform tasks using the immediate caller's class loader:
java.lang.Class.forName
java.lang.Package.getPackage(s)
java.lang.Runtime.load
java.lang.Runtime.loadLibrary
java.lang.System.load
java.lang.System.loadLibrary
java.sql.DriverManager.deregisterDriver
java.sql.DriverManager.getConnection
java.sql.DriverManager.getDriver(s)
java.util.logging.Logger.getAnonymousLogger
java.util.logging.Logger.getLogger
java.util.ResourceBundle.getBundle
그래서 한참을 찾던 중에 싱글톤 방식으로 해결을 보았습니다.
http://arangluv.tistory.com/?page=2 (페이지검색으로 forName 하시면 됩니다)
코드는
public static Class<?> getDriver(String driver) throws ClassNotFoundException{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if( loader == null ){
loader = 현재클래스명.class.getClassLoader();
}
return loader.loadClass(driver);
}
이 메소드를 Class.forName("드라이버명") 으로 대체 시켰습니다. 즉 현재클래스명.getDriver("드라이버명") 식으로요.
그랬더니 loader = 현재클래스명.class.getClassLoader(); 이 부분이 생성 안할 가능성이 있다고 해서
Thread.currentThread().getContextClassLoader(); 이걸로 대체하라는 게 나오는데
위의 메소드를 보면 싱글톤 방식으로 Thread.currentThread().getContextClassLoader(); 로 loader 변수에 대입하고
만약 null 이라면 getClassLoader() 로 해서 사용해라 인 싱글톤 방식인 것 같은데요.
어떻게 해결해야 할지 모르겠습니다.
행정자치부의 시큐어 코딩 java 부분 pdf(98페이지) 를 보았는데요
문자열을 체크한 후에 해당 클래스를 new 클래스명(); 하더군요..(oracle jdbc 드라이버이기 때문에 예제처럼 파라미터로 받고 그러진 않습니다)
그렇다면 저도 위에처럼 loader 뭐 저런거 쓰지말고 new OracleDriver(); 를 생성하면 될까요?
물론 싱글톤 방식으로 생성해서 사용하면 될런지요?
import oracle.jdbc.driver.OracleDriver 임포트 하고 전역변수처리
private static OracleDriver dirver = new OracleDriver();
// 유일한 객체에 접근할 수 있는 정적 메서드 정의
public static OracleDriver getDriver(){
return dirver ;
}
상세한 답변 부탁드립니다. 수고하세요..
A
안녕하세요. 문종덕님.
우선 문의 주신 내용은 저희 표준프레임워크 포털에서 도움을 드리기 어려울 것 같습니다.
보안에 대한 점검 규칙과 그에 대한 대응 코드는 적용하신 툴의 가이드 또는 기타 보안 코딩에 대한 가이드를 참조하시면 되실 것 같습니다.
추가적으로 표준프레임워크를 적용하신다면 해당되는 부분이 내부적으로 처리되는 DB Connection Pool 기능을 사용하실 수 있으며, 이 경우 현재 문제가 해결되실 것으로 판단됩니다.
그럼, 즐거운 하루되십시오.
감사합니다.
우선 문의 주신 내용은 저희 표준프레임워크 포털에서 도움을 드리기 어려울 것 같습니다.
보안에 대한 점검 규칙과 그에 대한 대응 코드는 적용하신 툴의 가이드 또는 기타 보안 코딩에 대한 가이드를 참조하시면 되실 것 같습니다.
추가적으로 표준프레임워크를 적용하신다면 해당되는 부분이 내부적으로 처리되는 DB Connection Pool 기능을 사용하실 수 있으며, 이 경우 현재 문제가 해결되실 것으로 판단됩니다.
그럼, 즐거운 하루되십시오.
감사합니다.