JScript 的安全注意事项
以任何语言编写安全代码都是一个挑战。 在 JScript 的某些领域,开发人员可能在不知情的情况下以非安全方式使用语言,因为该语言不强制开发人员使用最有效的做法。 虽然在设计 JScript 时将安全作为其中的一个目标,但是主要目标是促进有用应用程序的快速开发。 在某些情况下,这两个目标是对立的。
如果您知道下面列出的一些主要区域中的潜在问题,则可以避免安全问题。 除 eval 方法外,这些安全注意事项都是由于 .NET Framework 引入的新功能产生的。
eval 方法
最容易误用的 JScript 功能是 eval 方法,它允许动态执行 JScript 源代码。 因为使用 eval 方法的 JScript 应用程序可以执行程序传递给它的任何代码,所以对 eval 方法的每个调用都会造成安全风险。 除非您的应用程序需要灵活执行任何代码,否则请考虑显式编写应用程序传递至 eval 方法的代码。
安全特性
.NET Framework 的安全特性可用于显式重写 JScript 中的默认安全设置。 但是,除非您知道修改默认安全设置的后果,否则请不要修改。 特别是,由于不受信任的调用方通常无法安全地调用 JScript 代码,因此您不应当应用 AllowPartiallyTrustedCallers 特性 (APTCA) 的自定义特性。 如果您使用 APTCA 创建受信任的程序集,之后程序集被某个应用程序加载,则部分受信任的调用方可以访问该应用程序中完全受信任的程序集。 有关更多信息,请参见代码安全维护指南。
部分受信任的代码和寄宿的 JScript 代码
承载 JScript 的引擎允许调用的任何代码修改引擎的组成部分,例如,全局变量、局部变量以及任何对象的原型链。 另外,任何函数都可以修改传递至它的任何 expando 对象的 expando 属性或方法。 因此,如果 JScript 应用程序调用部分信任的代码,或者在某个包含其他代码的应用程序内(如从 Visual Studio for Applications [VSA] 宿主内)运行,那么,该应用程序的行为可能会被修改。
所以,应用程序(或 AppDomain 类的实例)中的任何 JScript 代码都应在较低的信任级别下运行,不得高于应用程序中其余代码的信任级别。 否则,其他代码可能会操作 JScript 类的引擎,而引擎又会修改数据,从而影响应用程序中的其他代码。 有关更多信息,请参见 _AppDomain。
程序集访问
JScript 可以引用同时使用强名称和简单文本名称的程序集。 强名称引用包括程序集的版本信息以及确认程序集的完整性和标识的加密签名。 虽然在引用程序集时使用简单名称较为容易,但是,如果您的系统上的另一个程序集具有相同的简单名称但功能不同,则强名称可以保护您的代码。 有关更多信息,请参见如何:引用具有强名称的程序集。
线程处理
JScript 运行时不是线程安全的。 因此,多线程 JScript 代码可能会具有不可预知的行为。 如果您使用 JScript 开发程序集,请记住,它可以用于多线程上下文。 您应使用 System.Threading 命名空间中的类(例如,Mutex 类)来确保程序集中的 JScript 代码使用正确的同步机制运行。
因为使用任何语言都很难编写正确的同步代码,因此您不应尝试使用 JScript 编写通用程序集,除非您非常熟悉如何实现必需的同步代码。 有关更多信息,请参见 System.Threading。
提示
您无需为使用 JScript 编写的 ASP.NET 应用程序编写同步代码,因为 ASP.NET 管理其生成的所有线程的同步。 但是,因为用 JScript 编写的 Web 控件的行为与程序集类似,所以它们必须包含同步代码。
运行时错误
因为 JScript 是一种松散类型化语言,所有它比其他一些语言(例如 Visual Basic 和 Visual C#)更能容忍潜在的类型不匹配情况。 因为类型不匹配可以导致应用程序中发生运行时错误,所以在开发代码时查找潜在的类型不匹配十分重要。 在 ASP.NET 页中,您可以将 /warnaserror 标志与命令行编译器或 @ Page 指令的 warninglevel 特性一起使用。 有关更多信息,请参见 /warnaserror 和 @ Page。
兼容性模式
与那些在快速模式(默认模式)下编译的程序集相比,在兼容性模式下编译的程序集(使用 /fast- 选项)的安全性较低。 /fast- 选项可启用默认情况下无法使用、但要与为 JScript 5.6 版及更早版本编写的脚本兼容又需要使用的语言功能。 例如,在兼容性模式下,可以将 expando 属性动态地添加到内部对象,例如 String 对象。
提供兼容性模式的目的是帮助开发人员从旧式 JScript 代码生成独立的可执行文件。 开发新的可执行文件或库时,请使用默认模式。 这不仅有助于确保应用程序的安全,而且可以确保性能得到改进以及与其他程序集更好地交互。 有关更多信息,请参见 /fast。