HTTP 응답은 세션 고정에 취약하지 않아야 합니다.

URL 매개변수와 같은 사용자 제공 데이터는 항상 신뢰할 수 없고 오염된 것으로 간주해야 합니다. 오염된 데이터에서 직접 쿠키를 만들면 공격자가 세션 식별자를 알려진 값(Set-Cookie, sessionId )으로 설정하여 공격자가 공격 대상자와 세션을 공유할 수 있습니다. 공격이 성공하면 공격 대상자가 인증할 때 세션 식별자가 재생성되지 않는 경우, 중요한 정보에 무단으로 액세스할 수 있습니다. 일반적으로 이러한 유형의 공격을 예방하는 방법은 허용 목록의 영향을 받을 수 있는 쿠키를 제한하는 것입니다. 규칙을 어긴 코드 from django.http import HttpResponse def index(r...

더보기

동적 코드 실행은 인젝션 공격에 취약하지 않아야 합니다.

코드를 동적으로 실행하는 애플리케이션은 코드 구성에 사용되는 외부 제공 값을 적절하게 변환해야 합니다. 그렇게 하지 않으면 공격자가 임의의 코드를 실행할 수 있습니다. 이것은 민감한 정보에 액세스/수정하거나 전체 시스템 액세스 권한을 얻는 것과 같은 광범위하고 심각한 공격으로 이어질 수 있습니다. 공격 가능성을 줄이는 전략은 허용된 값의 화이트리스트 또는 안전한 유형으로의 캐스팅을 기반으로 해야 합니다. 규칙을 어긴 코드 from flask import request @app.route('/') def index(): module = request.args.get("module") exec("i...

더보기

NoSQL 오퍼레이션은 인젝션 공격에 취약하지 않아야 합니다.

URL 매개변수 및 POST 메서드의 body-content와 같은 사용자 제공 데이터는 항상 신뢰할 수 없고 오염된 것으로 간주해야 합니다. 오염된 데이터를 기반으로 NoSQL 작업을 수행하는 응용 프로그램은 일반 SQL 인젝션 버그와 유사하게 이용될 수 있습니다. 코드에 따라 SQL 인젝션과 동일한 위험이 존재합니다: 공격자는 중요한 정보에 액세스하거나 데이터 무결성을 손상시키는 것을 목표로 합니다. 공격에는 쿼리 연산자, JavaScript 코드 또는 문자열 작업이 포함될 수 있습니다. 이 문제는 ODM(Object Document Mapper) 라이브러리를 사용하거나 데이터 사이즈 또는 허용된 문자를 기...

더보기

추상 메소드는 중복되어선 안됩니다

인터페이스에 있는 메서드와 동일한 signature를 같는 메소드를 추상 클래스로 정의할 이유가 없습니다. concrete 파생 클래스들은 어느 쪽 메서드든 구현해야 합니다. 규칙을 어긴 코드 public interface Reportable { String getReport(); } public abstract class AbstractRuleReport implements Reportable{ public abstract String getReport(); // 규칙을 어긴 코드 // ... } If you like SONARKUBE, don’t forget to give me a...

더보기

이스케이프 유니코드 문자는 사용되어선 안됩니다

유니코드 이스케이프 시퀀스를 사용하는 것은, 출력할 수 없는 문자같이 애매한 문자를 사용할 때만 사용되어야 합니다. 이 규칙은 유니코드 문자로만 구성된 문자열에서는 문제가 있다고 알리지 않습니다만, 그렇지 않고 혼용해서 사용하는 경우에 문제가 있다고 알립니다. 규칙을 어긴 코드 String prefix = "n\u00E9e"; // 규칙을 어긴 코드 규칙을 준수한 코드 String prefix = "née"; If you like SONARKUBE, don’t forget to give me a star. :star2: 원문으로 바로가기

더보기

"final" 클래스는 "protected" 멤버를 가져선 안됩니다

private과 protected의 차이점은 하위 클래스들이 protected로 선언된 멤버에는 접근할 수 있지만, private에는 접근이 안된다는 것입니다. 한편 final class는 하위 클래스가 존재할 수 없습니다. 따라서 멤버에 protected를 붙이는 것은 혼란스럽기만하고 무의미합니다. 클래스안의 protected 멤버는 동일한 패키지 내에 있는 다른 클래스에서도 확인 가능하고, 사용할 수 있습니다. 따라서 private를 사용한 것과는 다르게 의도치 않은 실수가 생길 수 있습니다. 규칙을 어긴 코드 public final class MyFinalClass { protected String...

더보기

Simple class names이 사용되어야 합니다.

자바의 import 메커니즘은 Simple class name을 사용할 수 있습니다. 따라서 클래스를 사용할 때 패키지 경로까지 포함한 전체 클래스 이름을 사용하는 것은 중복되는 일이며, 혼란을 야기합니다. 규칙을 어긴 코드 import java.util.List; import java.sql.Timestamp; //... java.util.List<String> myList; // 규칙을 어긴 코드 java.sql.Timestamp tStamp; // 규칙을 어긴 코드 규칙을 준수한 코드 import java.util.List; import java.sql.Timestamp; //......

더보기

logger는 자신을 소유한 클래스의 이름을 사용해야 합니다

logger에 logger를 소유한 각 클래스의 이름을 적는 것이 컨벤션입니다. 이렇게 함으로서 logger 설정이 더 명확하게 만들어줍니다. 클래스 이름을 적는 컨벤션을 지키면 각 클래스의 logger들이 엉켜 설정이 혼란스러워지는 상황을 방지합니다. SLF4J같은 일부 라이브러리에서는 이러한 상황이 벌어질 때 경고를 하지만, 모든 라이브러리가 그런 것은 아닙니다. 이 규칙은 logger에 자신을 소유한 클래스 이름이 지정되지 않았을 때 문제임을 알립니다. 규칙을 어긴 코드 public class MyClass { private final static Logger LOG = LoggerFactory.ge...

더보기