다음을 통해 공유


보안 및 사용자 입력

모든 종류의 입력(웹 요청 또는 URL의 데이터, Microsoft Windows Forms 애플리케이션의 컨트롤에 대한 입력 등)인 사용자 데이터는 종종 해당 데이터가 다른 코드를 호출하는 매개 변수로 직접 사용되기 때문에 코드에 부정적인 영향을 줄 수 있습니다. 이 상황은 이상한 매개 변수를 사용하여 코드를 호출하는 악성 코드와 유사하며 동일한 예방 조치를 취해야 합니다. 신뢰할 수 없는 데이터의 존재를 추적할 스택 프레임이 없으므로 사용자 입력은 실제로 안전하기 어렵습니다.

보안과 관련이 없는 것처럼 보이는 코드에 존재할 수 있지만 잘못된 데이터를 다른 코드로 전달하는 게이트웨이이기 때문에 가장 미묘하고 가장 어려운 보안 버그 중 하나입니다. 이러한 버그를 찾으려면 모든 종류의 입력 데이터를 따르고, 가능한 값 범위가 무엇인지 상상하고, 이 데이터를 보는 코드가 이러한 모든 사례를 처리할 수 있는지 여부를 고려합니다. 코드에서 처리할 수 없는 입력을 범위 검사 및 거부를 통해 이러한 버그를 수정할 수 있습니다.

사용자 데이터와 관련된 몇 가지 중요한 고려 사항은 다음과 같습니다.

  • 서버 응답의 모든 사용자 데이터는 클라이언트의 서버 사이트 컨텍스트에서 실행됩니다. 웹 서버에서 사용자 데이터를 가져와서 반환된 웹 페이지에 삽입하는 경우 예를 들어 스크립트< 태그를> 포함하고 서버에서처럼 실행할 수 있습니다.

  • 클라이언트는 URL을 요청할 수 있습니다.

  • 까다로운 경로 또는 잘못된 경로를 고려합니다.

    • .. \ , 매우 긴 경로입니다.

    • 와일드카드 문자 사용(*).

    • 토큰 확장(%token%).

    • 특별한 의미를 가진 이상한 형태의 경로입니다.

    • 와 같은 filename::$DATA대체 파일 시스템 스트림 이름

    • longfi~1longfilename와 같은 짧은 버전의 파일 이름 예시입니다.

  • Eval(userdata)은 무엇이든 할 수 있습니다.

  • 일부 사용자 데이터를 포함하는 이름에 대한 지연 바인딩을 주의해야 합니다.

  • 웹 데이터를 처리하는 경우 다음을 포함하여 허용되는 다양한 형태의 이스케이프를 고려합니다.

    • 16진수 이스케이프 (%nn).

    • 유니코드 이스케이프 (%nnn).

    • 과도하게 긴 UTF-8 이스케이프(%nn%nn).

    • 이중 이스케이프로%nn가 %mmnn로 바뀝니다. 여기서 %mm는 '%'의 이스케이프입니다.

  • 두 개 이상의 정식 형식을 가질 수 있는 사용자 이름을 주의해야 합니다. 예를 들어 MYDOMAIN\username 양식 또는 username@mydomain.example.com 양식을 자주 사용할 수 있습니다.

참고하십시오