在安装累积安全更新 974455 后,会在 Internet Explorer 中收到 VBScript“类型不匹配”脚本错误消息

简介
为解决发现的安全漏洞,Internet Explorer 累积安全更新 974455(在 MS09-054 中进行了介绍)向各种方法中引入了附加的“类型”安全检查。在某些特定情况下,这些新的类型安全检查可能会导致使用 VBScript 的网页或混合使用 VBScript 和 JavaScript 的网页中出现“类型不匹配”脚本错误。

有关 MS09-054 的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
974455 MS09-054:Internet Explorer 累积安全更新
症状
使用 VBScript 作为客户端脚本语言的网页以及使用 showModalDialog() 或 showModelessDialog() 方法的网页可能会遇到“类型不匹配”脚本错误。Microsoft 已经确定在以下三种情况下可能会生成“类型不匹配”脚本错误:
  • showModalDialog()
    第一种情况涉及到在 VBScript 中将 Array() 值作为参数传递到 showModalDialog() 方法。showModalDialog() 方法支持一个必需参数 (sURL) 和两个可选参数(vArguments 和 sFeatures)。vArguments 参数是一个 VARIANT 类型参数,该参数指定在显示文档时要使用的参数。如果开发人员决定将 Array() 直接传递到可选 vArguments 参数,将出现“类型不匹配”脚本错误。

    有关 showModalDialog 方法的更多信息,请访问下面的 Microsoft MSDN 网页:
  • showModelessDialog()
    第二种情况涉及到在 VBScript 中将 Array() 值作为参数传递到 showModelessDialog() 方法。showModelessDialog() 方法支持一个必需参数 (sURL) 和两个可选参数(vArguments 和 sFeatures)。vArguments 参数是一个 VARIANT 类型参数,该参数指定在显示文档时要使用的参数。如果开发人员决定将 Array() 直接传递到可选 vArguments 参数,将出现“类型不匹配”脚本错误。

    有关 showModelessDialog 方法的更多信息,请访问下面的 Microsoft MSDN 网页:
  • returnValue
    第三种情况涉及“模式对话框”窗口的 returnValue 属性的显式设置。returnValue 属性是没有默认值的读/写属性。根据 MSDN 上的文档,returnValue 属性仅应用于使用 showModalDialog() 方法创建的那些窗口。如果开发人员决定在 VBScript 中将“模式对话框”窗口的 returnValue 属性显式设置为 Array() 值,将出现“类型不匹配”脚本错误。

    有关 return Value 属性的更多信息,请访问下面的 Microsoft MSDN 网页:
目前,Microsoft 尚未在使用 JavaScript 作为唯一客户端脚本语言的网页中发现由累积安全更新 974455 引起的“类型不匹配”脚本错误。似乎仅影响在 VBScript 中使用 showModalDialog() 方法、showModelessDialog() 方法或 returnValue 属性的网页。如果网页混合使用 VBScript 和 JavaScript,则在该网页使用上述 VBScript 中的方法或属性或者该网页使用 VBArray 对象时,才可能受到影响。使用 VBArray 对象并不常见,因此,此知识库文章将不介绍涉及 VBArray 的情况。
原因
为解决在 Internet Explorer 中发现的安全漏洞,已发布 Internet Explorer 累积安全更新 MS09-054。作为此累积安全更新的一部分,Internet Explorer 引入了新的检查,以防止将 VARIANT 类型参数意外地转换为危险的数据类型。附加安全检查将对作为用户控制变量的一部分传递的 VARIANT 类型参数施加一些其他安全限制,以保护用户不受到某些种类的攻击。这些附加检查可能会影响使用 VARIANT 数据类型的合法浏览情形。
解决方案
为解决此问题,请在安装安全更新 974455 后安装更新 976749。有关此问题的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
976749有一个 Internet Explorer 更新,可解决在应用安全更新 974455 (MS09-054) 后出现的问题

重要说明:如果尚未安装安全更新 974455,请勿安装更新 976749。如果在没有首先安装安全更新 974455 的情况下安装更新 976749,则 Internet Explorer 可能不会正常运行。如果发生这种情况,请卸载更新 976749,安装安全更新 974455,然后重新安装更新 976749。
替代方法
如果您遇到的症状与此文章中所介绍的相同,那么我们建议您继续应用累积安全更新 974455,并且安装更新 976749。如果客户决定删除累积安全更新,则会导致其系统面临风险。

对于在“症状”部分介绍的第一个和第二个方案,如果不希望安装安全更新 974455,则您可以实施临时解决办法。为解决该问题,请将 Array() 变量显式声明到 VBScript 变量中。可以将数组传递到 showModalDialog() 或 showModelessDialog() 方法,不会生成“类型不匹配”脚本错误。

例如,以下 VBScript 将导致“类型不匹配”脚本错误。
// TYPE MISMATCHvReturn = window.showModalDialog("http://www.contoso.com", Array(1,2,3,4,5,6,7))
以下 VBScript 会将数组传递到 showModialDialog() 或 showModelessDialog() 方法,而不生成“类型不匹配”脚本错误。
// NO TYPE MISMATCH ERRORDim myArraymyArray=Array(1,2,3,4,5,6,7)vReturn = window.showModalDialog("http://www.contoso.com", myArray)
对于早期提到的第三个方案,如果您不希望安装安全更新 974455,则您可以实施规避措施。若要解决方案中的一维 Array() 值传递到 returnValue 属性的问题,请使用加入与拆分 VBScript 功能。这样便可以将 Array() 值传递到 returnValue 属性。

例如,以下 VBScript 将生成“类型不匹配”脚本错误。
// TYPE MISMATCHDim arrayItemsarrayItems(0) = 1arrayItems(1) = 2arrayItems(2) = 3Window.returnvalue = arrayItems
在使用 VBScript 的 Join 和 Split 函数时,可以设置 returnValue 属性,而不会生成“类型不匹配”脚本错误。
// NO TYPE MISMATCH ERRORDim arrayItemsarrayItems(0) = 1arrayItems(1) = 2arrayItems(2) = 3Dim arrString = Join(arrayItems, ";")Window.returnvalue = arrStringDim strTemp = window.showModalDialog(……)Dim arrayItems = Split(strTemp, ";")
对于前面讨论的第三种情况(其中将多维 Array() 值或具有对象的 Array() 值传递到 returnValue 属性),如果您不希望安装安全更新 974455,则您可以实施临时解决办法。若要解决本方案中的问题,可以使用 JavaScript 功能设置 returnValue 属性。此 JavaScript 函数可用于 VBScript 子例程和函数。由 JavaScript 函数设置的任何 returnValue 属性值均将可用于 VBScript。

例如,以下 VBScript 将生成“类型不匹配”脚本错误。
// TYPE MISMATCH<script LANGUAGE=vbscript>Option ExplicitSub Window_OnLoadDim abc(1,2,3)Window.ReturnValue = abcEnd Sub</script>
将 JavaScript 函数与现有 VBScript 一起使用时,可以设置 returnValue 属性,而不会生成“类型不匹配”脚本错误。
// NO TYPE MISMATCH ERROR<script Language=JavaScript>function setReturnValue(){var returnValueArray= new Array();returnValueArray[0] = 1;returnValueArray[1] = 2;returnValueArray[2] = 3;window.returnValue = returnValueArray;}</script><script LANGUAGE=vbscript??Option ExplicitSub Window_OnLoadsetReturnValue()msgbox window.returnValueEnd Sub</script>
状态
Microsoft 已经确认“适用于”部分中列出的 Microsoft 产品存在此问题。
属性

文章 ID:976949 - 上次审阅时间:12/03/2009 19:38:16 - 修订版本: 3.1

Windows Internet Explorer 8, Windows Internet Explorer 7, Microsoft Internet Explorer 6.0, Microsoft Internet Explorer 6.0 SP1, Microsoft Internet Explorer 5.01 Service Pack 4

  • kbcode kbtshoot kbbug kbexpertiseinter kbsecurity kbsecvulnerability kbsurveynew KB976949
反馈