시큐어코딩 가이드 Secure Coding Guide 입력값 검증

입력값검증

시큐어코딩 가이드 Secure Coding Guide 입력값 검증 – 보안 취약점 중 가장 많이 발생하는 취약점은 입력값 검증 미흡/부재 입니다. 입력값 검증에 대한 시큐어코딩을 알아보도록 하겠습니다.





 

입력 유효성 검사

“입력 유효성 검사”는 안전한 코딩 관행 체크리스트의 일환으로, 응용 프로그램으로 유입되는 데이터가 안전하고 잠재적인 보안 위험으로부터 자유로움을 보장하기 위한 조치를 다룹니다. 이는 신뢰할 수 있는 시스템에서 유효성을 검사하고, 신뢰할 수 있는 데이터 소스와 신뢰할 수 없는 데이터 소스를 구분하며, 문자 집합을 지정하고, 데이터 유형, 길이, 범위를 확인하며, 잠재적으로 위험한 문자에 대해 주의하는 등의 관행을 포함합니다. 목표는 악의적인 데이터가 응용 프로그램으로 들어가는 것을 방지하고, 허용해야 하는 경우 안전하게 처리하는 것입니다. 이러한 관행은 주입 공격과 같은 일반적인 보안 취약점에 대비하여 오로지 잘 형성되고 예상 가능하며 안전한 데이터만이 처리되도록 보장합니다.

 

입력 유효성 검사 상세 예시

1.1 Conduct all data validation on a trusted system
모든 데이터 유효성 검사는 클라이언트 측이 아닌 서버에서 수행되도록 합니다. 이로써 클라이언트 측 코드를 조작하여 유효성 규칙이 우회되는 것을 방지합니다. 사용자가 양식을 제출하면 서버가 입력 데이터를 유효성에 맞게 확인하고 기준을 충족하지 않으면 거부합니다. 클라이언트 측 JavaScript는 유효성 검사에 의존해서는 안 됩니다.

1.2 Identify all data sources and classify them
모든 데이터 소스를 확인하고 신뢰할 수 있는(예: 내부 데이터베이스) 또는 신뢰할 수 없는(예: 사용자 입력, 외부 API) 것으로 분류합니다. 신뢰할 수 없는 소스에서 오는 모든 데이터를 유효성 검사하여 악성 입력을 방지합니다. 사용자가 제출한 양식 및 외부 API에서 데이터를 처리할 때 소스에 관계없이 모든 입력이 철저히 유효성을 검사하도록 합니다.

1.3 Centralized input validation routine
일관되고 철저한 유효성 검사를 보장하기 위해 중앙 집중식 입력 유효성 검사 루틴을 구현합니다. 모든 사용자 입력에 대해 호출되는 단일 유효성 검사 함수를 생성하여 모든 입력이 사전 정의된 규칙에 따라 일관되게 유효성이 검사되도록 합니다.

1.4 Specify proper character sets
모든 입력 소스에 대해 일관된 문자 집합(예: UTF-8)을 정의하여 인코딩 불일치 및 잠재적인 보안 취약성을 방지합니다. 소스에 관계없이 모든 데이터가 UTF-8을 사용하여 일관된 문자 인코딩으로 인코딩되도록 합니다.

1.5 Encode data to a common character set
유효성 검사 전에 데이터를 공통 문자 집합(예: UTF-8)으로 변환하여 일관된 처리와 인코딩 기반 공격을 방지합니다. 사용자 입력을 유효성 검사하기 전에 UTF-8로 변환하여 문자 인코딩을 표준화합니다.

1.6 All validation failures result in input rejection
유효성 검사 실패시 입력을 거부하고 추가 처리를 방지하여 악성 데이터가 시스템으로 들어가는 것을 방지합니다. 사용자가 잘못된 입력을 제출하면 시스템이 이를 거부하고 추가 작업을 진행하지 않아야 합니다.






1.7 Determine system support for UTF-8 extended character sets
시스템이 UTF-8 확장 문자 세트를 지원하는지 확인하고 지원하는 경우 UTF-8 디코딩이 완료된 후에 입력을 유효성 검사하도록 합니다. 응용 프로그램이 확장된 문자 세트를 지원하는 경우 디코딩 후에 유효성 검사가 수행되도록 하여 잠재적인 인코딩 관련 취약성에 대응합니다.

1.8 Validate all client-provided data
모든 클라이언트로부터 제공된 데이터(매개변수, URL, HTTP 헤더 및 자동 포스트백 등)를 유효성 검사하여 악성 코드 삽입을 방지합니다. 클라이언트 측 소스(양식 제출 및 HTTP 헤더와 같은)에서 데이터를 처리할 때 코드 삽입 취약성을 피하기 위해 엄격하게 유효성을 검사합니다.

1.9 Verify header values contain only ASCII characters
모든 요청 및 응답의 헤더 값에는 ASCII 문자만 포함되도록 확인하여 문자 인코딩 차이에서 비롯된 잠재적인 공격을 방지합니다. 헤더 값이 ASCII 문자로 제한되어 있는지 확인하여 문자 인코딩 변이에서 비롯된 보안 문제를 방지합니다.

1.10 Validate data from redirects
악의적인 콘텐츠가 직접 리디렉션 대상에 제출되는 것을 방지하기 위해 리디렉션에서 데이터를 유효성 검사합니다. 리디렉션에서 데이터를 처리할 때 보안 로직 우회를 방지하기 위해 유효성 검사를 수행합니다.

1.11 Validate for expected data types
기대되는 데이터 형식(정수, 문자열 또는 날짜와 같은)과 일치하는지 확인하여 형식 관련 오류와 잠재적인 취약성을 방지합니다. 입력이 올바른 데이터 형식인지 확인하여 데이터 형식 불일치로 인한 오류 및 보안 문제를 방지합니다.

1.12 Validate data range
예상 범위 내의 입력 값인지 확인하여 오버플로 또는 언더플로 조건이 발생하지 않도록 하여 취약성을 방지합니다. 입력 값이 지정된 범위 내에 있는지 확인하여 데이터 오버플로 또는 언더플로 관련 보안 문제를 방지합니다.

1.13 Validate data length
버퍼 오버플로 및 기타 길이 기반 공격을 방지하기 위해 입력의 길이를 제한합니다. 입력 데이터의 길이를 제한하여 버퍼 오버플로 및 기타 길이 기반 취약성과 관련된 보안 위험을 완화합니다.






1.14 Validate all input against a “white” list
가능한 경우 입력을 허용된 문자의 화이트리스트에 대해 유효성을 검사하여 허용 가능한 입력의 범위를 제한하고 악성 코드 삽입을 방지합니다. 입력이 사전 정의된 화이트리스트에 대해 유효성을 검사하여 보안 위험을 최소화합니다.

1.15 Handle hazardous characters < > ” ‘ % ( ) & + \ ‘
허가해야 하는 위험한 문자가 있는 경우 출력 인코딩 및 안전한 API와 같은 추가 제어를 구현합니다. 응용 프로그램이 위험한 문자의 사용을 요구하는 경우 출력 인코딩 및 안전한 API와 같은 추가 보안 조치를 적용하여 잠재적인 위험을 완화합니다.

1.16 Check specific inputs
표준 유효성 검사가 실패하는 경우 특정 문제 있는 문자(%00), 새 줄 문자(%0d, %0a, \r, \n), 경로 변경 문자(../ 또는 ..) 및 위험한 문자의 대체 표현을 확인합니다. 표준 유효성 검사가 특정 입력을 감지하지 못하는 경우 특정 문제 있는 문자(널 바이트, 새 줄 문자, 경로 변경 시퀀스 또는 위험한 문자의 대체 인코딩)를 검사합니다.





 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다