모든 종류의 입력(웹 요청 또는 URL의 데이터, Microsoft Windows Forms 애플리케이션의 컨트롤에 대한 입력 등)인 사용자 데이터는 종종 해당 데이터가 다른 코드를 호출하는 매개 변수로 직접 사용되기 때문에 코드에 부정적인 영향을 줄 수 있습니다. 이 상황은 이상한 매개 변수를 사용하여 코드를 호출하는 악성 코드와 유사하며 동일한 예방 조치를 취해야 합니다. 신뢰할 수 없는 데이터의 존재를 추적할 스택 프레임이 없으므로 사용자 입력은 실제로 안전하기 어렵습니다.
보안과 관련이 없는 것처럼 보이는 코드에 존재할 수 있지만 잘못된 데이터를 다른 코드로 전달하는 게이트웨이이기 때문에 가장 미묘하고 가장 어려운 보안 버그 중 하나입니다. 이러한 버그를 찾으려면 모든 종류의 입력 데이터를 따르고, 가능한 값 범위가 무엇인지 상상하고, 이 데이터를 보는 코드가 이러한 모든 사례를 처리할 수 있는지 여부를 고려합니다. 코드에서 처리할 수 없는 입력을 범위 검사 및 거부를 통해 이러한 버그를 수정할 수 있습니다.
사용자 데이터와 관련된 몇 가지 중요한 고려 사항은 다음과 같습니다.
서버 응답의 모든 사용자 데이터는 클라이언트의 서버 사이트 컨텍스트에서 실행됩니다. 웹 서버에서 사용자 데이터를 가져와서 반환된 웹 페이지에 삽입하는 경우 예를 들어 스크립트< 태그를> 포함하고 서버에서처럼 실행할 수 있습니다.
클라이언트는 URL을 요청할 수 있습니다.
까다로운 경로 또는 잘못된 경로를 고려합니다.
.. \ , 매우 긴 경로입니다.
와일드카드 문자 사용(*).
토큰 확장(%token%).
특별한 의미를 가진 이상한 형태의 경로입니다.
와 같은
filename::$DATA
대체 파일 시스템 스트림 이름longfi~1
및longfilename
와 같은 짧은 버전의 파일 이름 예시입니다.
Eval(userdata)은 무엇이든 할 수 있습니다.
일부 사용자 데이터를 포함하는 이름에 대한 지연 바인딩을 주의해야 합니다.
웹 데이터를 처리하는 경우 다음을 포함하여 허용되는 다양한 형태의 이스케이프를 고려합니다.
16진수 이스케이프 (%nn).
유니코드 이스케이프 (%nnn).
과도하게 긴 UTF-8 이스케이프(%nn%nn).
이중 이스케이프로%nn가 %mmnn로 바뀝니다. 여기서 %mm는 '%'의 이스케이프입니다.
두 개 이상의 정식 형식을 가질 수 있는 사용자 이름을 주의해야 합니다. 예를 들어 MYDOMAIN\username 양식 또는 username@mydomain.example.com 양식을 자주 사용할 수 있습니다.
참고하십시오
.NET