"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.
원문으로 바로가기
유저의 인증 중에 새 세션을 생성해야합니다.
세션 고정 공격은 정당한 사용자가 공격자가 알고 있는 세션 아이디를 사용하도록 강제할 때 발생합니다.
고정 공격을 피하기 위해서는, 유저가 인증을 할 때 마다 새로운 세션을 생성하고, 세션이 만료될 때 기존 세션(공격자가 알고있는)을 삭제하거나 무효화하는 것이 좋은 습관입니다.
규칙을 어긴 코드
스프링 시큐리티 콘텍스트에서, 세션 고정 보호는 기본적으로 활성화되지만, 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...
전체 글 239개, 30 페이지