"entrySet()"은 key value가 둘 다 필요한 경우에만 사용되어야 합니다.

loop에서 Map의 key만 필요한 경우에는 keySet을 이용하여 순회하는 것이 좋습니다. 반면 key, value가 모두 필요한 경우라면, 양쪽 모두 접근할 수 있게 해주는 entrySet을 사용하여 순회하는 것이 더 효율적입니다. 규칙을 어긴 코드 public void doSomethingWithMap(Map<String,Object> map) { for (String key : map.keySet()) { // 규칙을 어긴 코드; 키 값은 value를 얻기위해서만 사용되고 있습니다. Object value = map.get(key); // ... } } 규칙을 준수...

더보기

"deleteOnExit"을 사용해선 안됩니다.

다음과 같은 이유로 File.deleteOnExit()을 사용하지 않는 것이 좋습니다. 삭제가 정상적인 JVM 종료의 경우에만 발생하게됩니다. 즉 JVM이 Crash로 종료되거나 kill 당한 경우에는 발생하지 않습니다. 각 file handler에 대해, 오직 프로세스가 종료하는 시점에 핸들러와 연관된 메모리가 해제됩니다. 규칙을 어긴 코드 File file = new File("file.txt"); file.deleteOnExit(); // 규칙을 어긴 코드 If you like SONARKUBE, don’t forget to give me a star. :star2: 원문으로 바로가기

더보기

유저의 인증 중에 새 세션을 생성해야합니다.

세션 고정 공격은 정당한 사용자가 공격자가 알고 있는 세션 아이디를 사용하도록 강제할 때 발생합니다. 고정 공격을 피하기 위해서는, 유저가 인증을 할 때 마다 새로운 세션을 생성하고, 세션이 만료될 때 기존 세션(공격자가 알고있는)을 삭제하거나 무효화하는 것이 좋은 습관입니다. 규칙을 어긴 코드 스프링 시큐리티 콘텍스트에서, 세션 고정 보호는 기본적으로 활성화되지만, sessionFixation().none() 메소드를 통해 비활성화 될 수 있습니다. @Override protected void configure(HttpSecurity http) throws Exception { http.session...

더보기

비밀번호는 평문 혹은 빠른 해싱 알고리즘을 통해 저장되지 않아야 합니다.

사용자의 비밀번호는 평문으로 저장되서는 안되며, 보안 알고리즘을 사용하여 해시값을 생성해야합니다. 무차별 공격에 취약해서는 안됩니다. collision attacks 에 취약해서는 안됩니다. (룰 S4790 을 참고하세요.) 레인보우 테이블 공격의 위험성을 줄이기 위해 솔트 값을 패스워드에 추가해야 합니다. (룰 S2053 을 참고하세요.) 이 룰은 암호가 평문으로 저장되거나 무차별 공격에 취약한 해싱 알고리즘을 사용했을 때 문제를 제기합니다. md5나, SHA 종류의 함수들은 해시값을 빠르게 계산할 수 있기에, 특히 GPU, FPGA 혹은 ASIC 과 같은 하드웨어 장비를 통해 무차별 대입 공격...

더보기

Java 기능이 Guava보다 우선시되어야 합니다.

Java 7 버전의 JDK에서 존재하지 않는 API 들을 Guava가 보완해주고 있었기 때문에, Guava의 어떤 기능들은 Java 7 애플리케이션에서 사용하기 분명 효과적이었습니다. 하지만 Java 8에 와서는 이런 한계들을 수정했습니다. Java 8 버전으로 마이그레이션 하시거나, Java 8을 이용해 새로운 프로젝트를 시작하신다면, Guava의 API를 사용하는 것 보다 Java 8 API를 우선시해서 사용하는 것을 (유지 보수 관점에서) 추천드립니다. 그래야 개발자는 두 API를 사용하는 방법을 배울 필요가 없고, 표준 API를 지키면 됩니다. Java 9에 와서는 더 많은 효과적인 메소드들이 표준 자바 ...

더보기

영속 개체들(Persist Entities)은 "@RequestMapping" 메소드의 인수로 사용해서는 안됩니다.

스프링 MVC 는 자동으로 “@RequestMapping” 으로 어노테이션이 달린 메소드의 요청 파라미터들을 빈으로 바인딩합니다. 이러한 자동 바인딩 기능때문에, “@RequestMapping” 으로 어노테이션된 메소드의 인자들에 예상치못한 필드들을 주입하게 될 수 있습니다. 영속 개체들(“@Entity” 혹은 “@Document”)은 데이터베이스들과 연결되고, Hibernate, JPA 또는 Spring Data MongoDB 과 같은 영속 프레임워크를 통해 자동적으로 갱신됩니다. 이러한 두 가지 요소들이 결합되어 악의적인 공격이 가능합니다: 만약 영속 개체가 “@RequestMapping” 으로 어노테이션된 메...

더보기

"HttpSecurity" URL 패턴은 올바르게 정렬되어있어야 합니다.

HttpSecurity.authorizeRequests() 메소드로 설정된 URL 패턴은 선언된 순서로 고려됩니다. 이것은 더 세부적으로 구성된 설정 앞에 덜 세부적으로 구성된 설정을 선언하는 실수를 하기 쉽게 합니다. 그러므로, “antMatcher” 선언의 순서를 확인할 필요가 있습니다. “/**” 이 선언된 경우, 이 설정은 마지막에 선언되어야 합니다. 이 규칙은 다음과 같은 상황에서 문제를 제기합니다. 패턴 앞에 **로 끝나는 패턴이 있고 시작이 동일한 경우 예 : “/page-admin/db/**“가 “/page-admin/*” 뒤에 있는 경우 와일드카드 문자...

더보기

"ThreadLocal.withInitial"을 우선해서 사용하는게 좋습니다.

익명 내부 클래스를 만들어 ThreadLocal 인스턴스를 초기화하는 것의 대안으로, Java 8부터 ThreadLocal.withInitial이라는 것이 소개됐습니다. 이 규칙은 ThreadLocal 익명 내부 클래스가 ThreadLocal.withInitial으로 대체될 수 있을 때 알람을 울립니다. 규칙을 어긴 코드 ThreadLocal<List<String>> myThreadLocal = new ThreadLocal<List<String>>() { // 규칙을 어긴 코드 @Override protected List<String&g...

더보기