SQL 쿼리 형식은 보안에 민감할 수 있습니다.

형식이 지정된 쿼리는 유지보수 및 디버깅이 어려울 수 있으며, 신뢰할 수 없는 값을 쿼리와 결합할 때 SQL Injection 위험을 증가시킬 수 있습니다. 하지만, 이 규칙은 {rule:javasecurity:s3649} 과는 달리 SQL Injection 을 감지하지 않으며, 복잡하고 형식이 지정된 쿼리를 강조하는 것이 목표입니다. 스스로에게 자문하세요 쿼리의 일부는 신뢰할 수 없는 값(사용자 입력과 같은)에서 가져옵니다. 쿼리가 코드의 다른 부분에서 반복 또는 중복됩니다. 애플리케이션은 서로 다른 유형의 관계형 데이터베이스를 지원해야 합니다. 이러한 질문에 예라고 답하는 경우 문제가 발생할...

더보기

조건절에서 어떤 두개의 분기가 같은 구현을 가지고 있어선 안됩니다.

switch 문에 case의 구현이 중복되거나 if chain이 중복된 코드를 갖는 경우, 중복 코드에서 끝나는 게 아니라 최악의 경우 코딩 에러라고 까지 볼 수 있습니다. 만약 정말로 같은 로직이 필요한 경우였다면, 케이스를 하나로 합치거나 switch 문의 경우, case를 함께 써서 같은 코드에 도달하도록 해야합니다. 규칙을 어긴 코드 switch (i) { case 1: doFirstThing(); doSomething(); break; case 2: doSomethingDifferent(); break; case 3: // 규칙을 어긴 코드; case 1...

더보기

인스턴스 및 클래스 메서드에는 하나 이상의 위치 매개 변수가 있어야 합니다.

모든 인스턴스 메서드에는 적어도 하나의 위치 매개 변수가 있어야 합니다. 이 매개 변수는 메서드가 호출되는 개체 인스턴스를 참조합니다. 하나 이상의 매개 변수가 없는 인스턴스 메서드를 호출하면 “TypeError”가 발생합니다. 관례적으로 이 첫 번째 매개변수는 보통 “self”로 명명됩니다. 클래스 메소드, 즉 @classmethod 어노테이션이 있는 메소드도 하나 이상의 매개 변수가 필요합니다. 유일한 차이점은 클래스 인스턴스 대신 클래스 자체를 수신한다는 것입니다. 관례적으로 이 첫 번째 매개변수는 일반적으로 cls로 명명됩니다. __new__와 __init_subclass__는 @classmethod 데코...

더보기

조건부 구조의 모든 분기에 정확히 동일한 구현이 되어서는 안됩니다.

if 체인의 모든 분기에서 동일한 구현을 갖는 것은 오류입니다. 복사 붙여넣기 오류가 발생하여 무엇인가 다른 것이 실행되거나, if 체인이 전혀 없어야 합니다. 규칙을 어긴 코드 if b == 0: # 규칙 미준수 doOneMoreThing() elif b == 1: doOneMoreThing() else: doOneMoreThing() b = 4 if a > 12 else 4 # 규칙 미준수 예외 이 규칙은 else-s가 없는 체인의 경우에는 적용되지 않습니다. if b == 0: # 문제 없습니다. 코드를 더 읽기 쉽게 만들기 위해 의도했을 수 있습니다. doOne...

더보기

추상 클래스의 생성자는 public으로 선언되어선 안됩니다.

추상 클래스에 public 생성자가 있으면 안 됩니다. 추상 클래스의 생성자는 하위 클래스의 생성자에서만 호출할 수 있습니다. 그래서 이것들을 public으로 선언하는 것은 의미가 없습니다. protected로 선언되어 있으면 충분합니다. 규칙을 어긴 코드 public abstract class AbstractClass1 { public AbstractClass1 () { // 규칙을 어긴 코드, public 선언이 되어있습니다. // do something here } } 규칙을 준수한 해결책 public abstract class AbstractClass2 { pro...

더보기

사용자 열거(User enumeration)를 허용하는 것은 보안에 민감합니다.

사용자 열거(User enumeration)는 웹 애플리케이션 데이터베이스에 존재하는 사용자의 이름을 추측하는 기능을 말합니다. 이것은 웹사이트의 “로그인 / 로그아웃 / 비밀번호 찾기” 등을 수행할 때 발생할 수 있습니다. 유저가 잘못된 이름으로 웹사이트에 “로그인”을 시도할 때, 웹 애플리케이션은 “올바른 사용자의 이름이 아닙니다.”와 유사한 메시지와 함께 사용자의 이름이 존재하지 않는다는 사실을 드러내서는 안됩니다. 대신, “잘못된 자격증명입니다.” 처럼 인증 과정에서 사용자의 이름이나 암호가 잘못되었는지를 추측할 수 없는 일반적인 메시지를 표시해야 합니다. 만약 유저 관리 기능이 사용자 이름이 존재하는지...

더보기

인증 바이패스를 방지하기 위해 OpenSAML2 가 설정되어야 합니다.

2018년에, Duo Security 는 SAML 기반 SSO(Single Sign-On) 시스템에 영향을 끼치는 새로운 취약점 클래스를 발견했고, 이로 인해 다음의 취약성 (CVE-2017-11427, CVE-2017-11428, CVE-2017-11429, CVE-2017-11430, CVE-2018-0489, CVE-2018-7340) 이 공개되었습니다. 특수하게 조작된 파일에서, 이미 자신의 계정으로 SAML 시스템에 접근한 공격자는 인증 메커니즘을 무시하고 다른 사용자로 인증할 수 있습니다. 이것은 SAML 프로토콜이 XML 포맷에 의존하고, 기본 XML 파서가 XML 구문을 해석하는 방식 때문입니다...

더보기

팩토리 메서드 주입은 "@Configuration" 클래스에서 사용해야 합니다.

@Autowired 를 사용하는 경우 클래스가 인스턴스화될 때 의존성이 해결되어야 하며, 이로 인해 Bean 이 lazy loading 되지 않고 초기에 인스턴스화 되거나, 찾을 수 없는 Bean 값을 바라보게 되는 문제를 발생시킬 수 있습니다. 이러한 까다로운 문제를 피하고 스프링 컨텍스트의 로드 방식을 최적화하려면, 의존성은 가능한 늦게 요청되어야합니다. 즉, 단일 @Bean 메소드에서만 사용되는 의존성에 대해 필드 주입 대신 파라미터 주입을 사용해야합니다. 규칙을 어긴 코드 @Configuration public class FooConfiguration { @Autowired private Dat...

더보기