JScript 的安全注意事项
更新:2007 年 11 月
以任何语言编写安全代码都是一个挑战。JScript 的一些部分中开发人员可能在不知情的情况下以非安全方式使用语言,因为该语言不强制开发人员使用最有效的做法,虽然在设计 JScript 时将安全作为其中的一个目标,但是主要目标是促进有用应用程序的快速开发。在某些情况下,这两个目标是对立的。
如果您知道下面列出的一些主要区域中的潜在问题,则可以避免安全问题。除 eval 方法外,这些安全注意事项都是由于 .NET Framework 引入的新功能产生的。
eval 方法
最容易误用的 JScript 功能是 eval 方法,它允许动态执行 JScript 源代码。因为使用 eval 方法的 JScript 应用程序可以执行程序传递给它的任何代码,所以对 eval 方法的每个调用都会造成安全风险。除非您的应用程序需要灵活执行任何代码,否则请考虑显式编写应用程序传递至 eval 方法的代码。
为增加需要 eval 方法提供的完整灵活性的应用程序的安全,默认情况下传递给 eval 的代码在受限上下文中运行。受限安全上下文有助于禁止对系统资源的所有访问,如文件系统、网络或用户界面。如果代码试图访问这些资源,则会产生安全异常。但是,eval 方法运行的代码仍可以修改局部变量和全局变量。有关更多信息,请参见 eval 方法。
用以前版本的 JScript 编写的代码可能需要 eval 方法将代码与调用代码在同一安全上下文中运行。要实现这种行为,您可以将字符串“unsafe”作为第二个可选参数传递至 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。