JScript에 대한 보안 고려 사항

안전한 코드를 작성하는 것은 모든 언어의 과제입니다. 언어 자체에서 강제적으로 개발자가 가장 효율적인 방법을 사용하도록 할 수는 없기 때문에, JScript 의 일부 영역에서는 보안상 위험한 방식을 사용하지 않도록 매우 주의해야 합니다. JScript는 보안을 목표로 설계되었지만, 주요 목표는 유용한 응용 프로그램을 빠르게 개발할 수 있도록 하는 것입니다. 경우에 따라 이러한 목표는 서로 상반될 수도 있습니다.

아래에 나열된 몇 가지 주요 영역에서 발생할 수 있는 문제를 인식하고 있으면 보안 문제를 막을 수 있습니다. 이러한 보안 고려 사항은 eval 메서드를 제외하면 .NET Framework에서 도입된 새로운 기능 때문에 생긴 것입니다.

eval 메서드

가장 흔히 잘못 사용되는 JScript의 기능은 JScript 소스 코드를 동적으로 실행할 수 있도록 하는 eval 메서드입니다. eval 메서드를 사용하는 JScript 응용 프로그램은 프로그램이 전달하는 모든 코드를 실행할 수 있기 때문에 eval 메서드를 호출하는 경우 항상 보안상의 위험에 노출됩니다. 응용 프로그램에서 모든 코드를 실행할 수 있어야 할 정도의 유연성이 필요하지 않은 경우에는 응용 프로그램에서 eval 메서드로 전달하는 코드를 사용자가 명시적으로 작성하는 것이 좋습니다.

보안 특성

.NET Framework의 보안 특성을 사용하여 JScript의 기본 보안 설정을 명시적으로 재정의할 수 있습니다. 그러나 보안 기본값은 정확히 상황을 파악하지 못한 상태에서는 수정하지 않는 것이 좋습니다. 특히, 신뢰할 수 없는 호출자는 일반적으로 JScript 코드를 안전하게 호출할 수 없기 때문에 AllowPartiallyTrustedCallers(APTCA) 사용자 지정 특성은 적용하지 않는 것이 좋습니다. 응용 프로그램이 로드한 APTCA로 신뢰할 수 있는 어셈블리를 만들면, 부분적으로 신뢰할 수 있는 호출자가 응용 프로그램에 포함된 완전히 신뢰되는 어셈블리에 액세스할 수 있습니다. 자세한 내용은 보안 코딩 지침을 참조하십시오.

부분적으로 신뢰할 수 있는 코드 및 호스팅된 JScript 코드

JScript를 호스팅하는 엔진에서는 호출된 모든 코드가 전역 변수, 로컬 변수 및 개체의 프로토타입 체인과 같은 엔진의 영역을 수정할 수 있습니다. 또한 모든 함수는 전달된 expando 속성이나 expando 개체의 메서드를 수정할 수 있습니다. 따라서 JScript 응용 프로그램이 부분적으로 신뢰할 수 있는 코드를 호출하거나 VSA(Visual Studio for Applications) 호스트와 같이 다른 코드가 있는 응용 프로그램에서 실행되고 있으면, 응용 프로그램의 동작을 수정할 수 있습니다.

결론적으로, 응용 프로그램 또는 AppDomain 클래스의 인스턴스에 있는 모든 JScript 코드는 해당 응용 프로그램의 다른 코드보다 높은 신뢰 수준에서 실행되면 안 됩니다. 그렇지 않으면 다른 코드에서 JScript 클래스의 엔진을 조작할 수 있으며, 데이터를 수정하고 응용 프로그램의 다른 코드에 영향을 줄 수 있습니다. 자세한 내용은 _AppDomain을 참조하십시오.

어셈블리 액세스

JScript는 강력한 이름과 간단한 텍스트 이름을 모두 사용해서 어셈블리를 참조할 수 있습니다. 강력한 이름 참조에는 어셈블리의 무결성과 ID를 확인하는 암호화된 서명뿐 아니라 어셈블리의 버전 정보가 포함됩니다. 어셈블리를 참조할 때 간단한 이름을 사용하는 것이 더 편하지만, 강력한 이름을 사용하면 간단한 이름은 같지만 다른 기능을 수행하는 어셈블리가 시스템상에 있는 경우 코드를 보호합니다. 자세한 내용은 방법: 강력한 이름의 어셈블리 참조를 참조하십시오.

스레딩

JScript 런타임은 스레드로부터 안전하도록 설계되지 않았습니다. 따라서 다중 스레드에서 실행되는 JScript 코드는 경우에 따라 예상과 다르게 동작할 수도 있습니다. JScript에서 어셈블리를 개발하는 경우에는 어셈블리가 다중 스레드 컨텍스트에서 사용될 수 있다는 점을 고려하십시오. 어셈블리의 JScript 코드가 적절하게 동기화되어 실행되게 하려면 Mutex 등의 클래스를 System.Threading 네임스페이스에서 사용해야 합니다.

모든 프로그래밍 언어의 경우, 적절한 동기화 코드를 작성하는 것은 쉽지 않으므로 필요한 동기화 코드를 구현하는 방법을 잘 알고 있지 않으면 JScript에서 일반적인 용도의 어셈블리를 작성하지 않아야 합니다. 자세한 내용은 System.Threading을 참조하십시오.

참고

ASP.NET은 생성하는 모든 스레드의 동기화를 관리하기 때문에 JScript로 작성된 ASP.NET 응용 프로그램의 동기화 코드를 작성하지 않아도 됩니다. 그러나 JScript로 작성된 웹 컨트롤은 어셈블리처럼 동작하기 때문에 동기화 코드를 포함해야 합니다.

런타임 오류

JScript는 비교적 자유로운 형식의 언어이기 때문에 Visual Basic 및 Visual C# 같은 언어에 비해 형식 불일치에 대한 처리가 비교적 엄격하지 않습니다. 형식이 일치하지 않으면 응용 프로그램에서 런타임 오류를 발생시킬 수 있기 때문에, 코드를 작성할 때 형식 불일치가 발생할 가능성은 없는지 반드시 확인해야 합니다. 이렇게 하려면 명령줄 컴파일러에서 /warnaserror 플래그를 사용하거나 ASP.NET 페이지에서 @ Page 지시문의 warninglevel 특성을 사용합니다. 자세한 내용은 /warnaserror@ Page를 참조하십시오.

호환성 모드

호환성 모드에서 /fast- 옵션을 사용하여 컴파일된 어셈블리는 기본 모드인 고속 모드에서 컴파일된 어셈블리보다 보안성이 떨어집니다. /fast- 옵션을 사용하면, 기본적으로는 사용할 수 없지만 JScript 버전 5.6 및 이전 버전에서 작성된 스크립트와의 호환성을 위해 필요한 언어 기능을 사용할 수 있습니다. 예를 들어, expando 속성은 호환성 모드에서 String 개체와 같은 내장 개체에 동적으로 추가할 수 있습니다.

호환성 모드는 개발자가 레거시 JScript 코드에서 독립 실행형 실행 파일을 빌드하는 것을 지원하기 위해 제공됩니다. 새로운 실행 파일이나 라이브러리를 개발할 때는 기본 모드를 사용하십시오. 이렇게 하면 응용 프로그램의 보안을 강화할 수 있을 뿐만 아니라 다른 어셈블리와의 상호 작용과 성능도 향상시킬 수 있습니다. 자세한 내용은 /fast를 참조하십시오.

참고 항목

개념

JScript 이전 버전에서 만든 응용 프로그램 업그레이드

기타 리소스

네이티브 및 .NET Framework 코드의 보안