Share via


보안 및 사용자 입력

업데이트: 2007년 11월

웹 요청 또는 URL에서 받은 데이터와 Microsoft Windows Forms 응용 프로그램의 컨트롤에 대한 입력 등을 포함하여 모든 종류의 사용자 입력 데이터는 다른 코드를 호출하는 매개 변수로 직접 사용되는 경우가 많기 때문에 코드에 악영향을 미칠 수 있습니다. 이런 상황은 이상한 매개 변수로 코드를 호출하는 악성 코드의 경우와 비슷하므로 같은 예방 조치를 취해야 합니다. 사용자 입력의 경우 신뢰할 수 없는 데이터가 있는지 여부를 추적하기 위한 스택 프레임이 없기 때문에 안전을 보장하기가 더 어렵습니다.

이러한 문제는 보안과 관련이 없어 보이는 코드에 존재할 수 있지만 실제로는 다른 코드로 올바르지 않은 데이터를 전달하는 통로가 되므로 발견하기가 가장 미묘하고 어려운 보안 버그에 속합니다. 이러한 버그를 찾으려면 모든 유형의 입력 데이터를 따라가면서 가능한 값의 범위가 될 수 있는 것을 생각해 보고 해당 데이터를 받는 코드가 이 모든 경우를 처리할 수 있는지 고려해야 합니다. 범위를 검사하고 코드가 처리할 수 없는 입력을 거부하면 이러한 버그를 해결할 수 있습니다.

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

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

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

  • 다음과 같이 복잡하거나 잘못된 경로를 고려하십시오.

    • ..\ , 매우 긴 경로

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

    • 토큰 확장(%토큰%)

    • 특별한 의미가 있는 이상한 형식의 경로

    • 다른 파일 시스템 스트림 이름(예: filename::$DATA)

    • 짧은 파일 이름(예: longfilename의 경우 longfi~1)

  • Eval(userdata)은 어떤 작업이든 수행할 수 있습니다.

  • 사용자 데이터가 포함된 이름을 런타임에 바인딩할 때는 주의해야 합니다.

  • 웹 데이터를 처리하는 경우에는 다음과 같이 허용 가능한 다양한 형식의 이스케이프를 고려하십시오.

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

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

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

    • 배정밀도 이스케이프(%nn은 %mmnn이 됨. 여기에서 %mm은 '%'의 이스케이프)

  • 둘 이상의 정규 형식이 있을 수 있는 사용자 이름에 주의하십시오. 예를 들어, Microsoft Windows 2000에서는 종종 MYDOMAIN\username 형식 또는 username@mydomain.example.com 형식 중 하나를 사용할 수 있습니다.

참고 항목

기타 리소스

보안 코딩 지침