微调你的Web站点以适应Windows XP Service Pack 2原作:Microsoft Corporation 2004年7月
body {FONT-SIZE: 12px; FONT-FAMILY: Verdana;}
STRONG { FONT-SIZE: 14px; COLOR: #0033CC; }
译者:Amom 2004年8月
应用于:
Microsoft ActiveX控件
Microsoft IE浏览器
Microsfot Outlook
Microsoft Windows XP SP2
摘要:确保你的站点在Windows XP Service Pack 2的新安全特性下运行良好,这些特性将影响到ActiveX控件,文件下载,弹出窗口等很多方面。
包含的主题:
你的Web站点使用微软ActiveX控件吗?
在Windows XP Service Pack 2中,通过使用信息栏(Information Bar)可以从一开始就将ActiveX控件的模态安装提示拦截。当你升级已安装的ActiveX控件时,倘若遇到下列情况之一,系统将生成一个异常:
ActiveX控件必须通过信任代码技术的验证才能在计算机上注册。(它引用于HKEY_CLASSES_ROOT\CLSID\{control_clsid}\InProcServer32,在这里control_clsid是用OBJECT标签表示的CLSID)
新控件上数字签名的发布者名称必须匹配已存在控件上数字签名的发布者名称。
如果ActiveX控件是用CAB文件打包,那么它必须通过验证。DLL或OCX也必须验证来保证以后的升级中不再被信息栏拦截。
如果信息栏拦截了一个ActiveX控件,IE浏览器将显示一个内嵌图标和替代控件安装指示信息的文字。用户可以点击这个区域或信息栏去安装这个ActiveX控件。
ActiveX控件是用CAB文件分发的吗?
如果是,注意以后升级控件时安装提示同样会被信息栏拦截,除非你通过签名DLL或OCX注册了ActiveX控件。
当一个ActiveX控件是否被安装时你的Web站点是否有不同的处理?(例如,自动转向或者在刷新时特殊处理)
一些Web网页在用户选择不安装ActiveX控件时自动转向或者刷新页面后采取不同的处理。在某些情形下,通过这种方式你的站点可以使用户不安装控件,避免了一次糟糕的用户体验。
当你碰到网页不能够区别是用户拒绝安装还是控件被信息栏拦截时,推荐的做法是在一个独立页面中创建一个新的控件实例来解释安装此控件的用途。同样,请在<OBJECT>标签里用一个<SPAN>模块动态显示帮助文本给安装失败的用户。
你的Web站点有信任代码提示图像吗?
为了避免用户混淆,你可以更新这些图像去反映新信任代码的用户界面(UI)。你可以使用User Agent字符串去测定浏览器版本。(检测SP2的更多信息参见一般提示。)
ActiveX安装对话阻止了控件的安装吗?
如果对话在安装时没有提供一个选项,文件将不会正确地通过验证。确保你有验证文件及签名有效。当签名失效时,SP2默认地会隐藏控件的安装。
关于ActiveX的最佳措施
不要使用弹出窗口或模态对话框来安装控件。
不要建议用户在安装ActiveX控件时降低他们系统的安全设置。
在一个独立的页面中创建一个控件实例描述控件用途和对用户的最终影响。
你的Web站点允许用户下载文件吗?
在SP2中,信息栏将拦截自动载入的文件下载提示。
相对于SP1,在SP2中,文件下载提示,邮件附件,Shell和程序安装都已被修改的更加稳固和清晰。当你下载一些能够被标记、对计算机有潜在威胁的文件时,SP2将显示该文件的发布者信息。(通常被标记对用户计算机有潜在威胁的文件类型是.exe,.dll,.ocx,.msi)
你的Web站点自动载入下载提示吗?
如果Web站点尝试去链接一个下载资源而显示文件下载对话框并导致用户无法通过鼠标和键盘来控制计算机行为时,信息栏将拦截这个文件下载提示。
如果不希望下载被拦截,请确保让用户直接控制下载。
你的Web站点包含文件扩展名不匹配内容类型的文件吗?
如果MIME-Handlers处理了你的站点服务器文件,那么这些文件的扩展名应该和MIME-Handlers有一致的ProgID。如果一个文件的内容类型的ProgID不匹配它的扩展ProgID,SP2下的IE浏览器将采取下列两个措施:1)用户被提示下载文件; 2)当执行MIME-Handler失败时,它的扩展Handler将不被执行。
你可以通过改变内容类型以匹配扩展类型来纠正这些错配,前提是确保这些措施对你的Web站点有利。例外情况:在某些情况下这种改变将是无用的。这些情况是在"content-disposition=attachment"头部信息发送的时候,文件名或扩展名将由服务器来最终决定而不是通过MIME。
你的Web站点有使用下载模态对话框图像,或是在用户点击安装控件的地方显示图像或文字吗?
如果顾客使用了SP2,请确保更新指向下载提示来反映新下载会话的图像。在IE中,你可以使用User Agent字符串来确定显示信息的图像版本。(检测SP2的更多信息参见一般提示。)
你的Web站点有需要数字验证的下载吗?
现在,SP2可以检测那些需要数字验证文件的数字签名。最常见的例子是包括以下扩展名的文件:.exe,.dll,.ocx,.msi。如果你发布过需要信任代码技术验证的文件,那么顾客现在能够去验证你创建的文件。这种应用包含IE浏览器和Outlook Express。
你的Web站点使用弹出窗口吗?
现在SP2下的IE浏览器包含一个默认打开的弹出窗口拦截器。这个拦截器可以干扰那些通过脚本自动弹出窗口的站点。它还包括一个信任列表来列入那些用户允许弹出新窗口的站点。默认情况下,弹出窗口拦截器不会尝试去拦截来自企业内部网和信任站点区域的弹出窗口。
IE浏览器
IE浏览器将会阻止除createPopup()之外的从脚本自动打开的任何窗口。受此影响的一些常用函数是:window.open(), showModelessDialog(), showModalDialog(), and showHelp()。(注意:由于弹出限制,自动指向搜索pane也会被阻止。)
一个由用户直接行为弹出的窗口()将不被阻止。弹出窗口拦截不会默认的应用于企业内部网和信任站点区域。
怎样知道IE浏览器阻止了我的弹出窗口?
如果窗口被拦截,函数将返回一个返回NULL的窗口对象。确保检查window.open()的返回值来避免弹出窗口被拦截时发生脚本错误。
基于一个被拦截的弹出窗口,你的站点使用了转向或关闭页面的措施吗?
无论何种可能的情况下,在被拦截窗口中,都不要做转向或关闭窗口。在弹出窗口被阻止时,如果你转向到另一个站点,那可能更加难于显示被拦截的内容。在这种情况下,转向后的站点将不显示可以使用户便利地访问弹出内容的信息栏。
相似的,如果窗口被拦截时关闭,信息栏将指向不显示弹出窗口的拦截信息。
你的站点从一个弹出窗口载入另一个弹出窗口吗?
任何可能的情况下,不要从一个弹出窗口自动载入另一个弹出窗口,弹出窗口拦截器不认为这是一个用户行为并将阻止它。
你自动载入setHomePage()模态对话框吗?
在SP2中,setHomePage()函数仅仅在一个类似用户行为下弹出窗口。自动载入setHomePage()提示将被阻止。
当有不同步请求的信息时,你的Web站点打开新的窗口吗?
在不同步请求信息后IE浏览器可能阻止站点打开的那个窗口,即使用户点击了一个链接去打开窗口。在不同步的请求信息之前,Windows不会阻止由用户行为(鼠标点击)直接打开的窗口。由用户初始的行为不会被坚持。
你的Web站点是否通过ActiveX控件或其他一些页面对象载入了弹出窗口?
和其它弹出窗口一样,如果一个窗口不是通过用户行为弹出,拦截器将阻止它。一个窗口在响应用户直接行为下被允许打开。
弹出窗口的一般建议:
不要在弹出窗口失败时转向。
如果一个弹出窗口,下载,或ActiveX控件被拦截,不要关闭或自动转向窗口。如果你这样做了,用户将不能够点击信息栏去接受弹出窗口,下载,或ActiveX控件。
不要从一个弹出窗口自动载入另一个弹出窗口。
不要从用户行为中载入多个弹出窗口。
不要从showModelessDialog()或showModalDialog()调用中载入自动弹出窗口。
你的Web站点依赖微软的Java虚拟机吗?
参见微软网站上的 Microsoft Java Virtual Machine Support。
浏览器窗口限制
你的Web站点使用定位窗口而使标题栏或地址栏在显示的可见区域顶部之上或状态栏在显示的可见区域底部之下吗?
回顾一下你的代码看看你是否正确理解了对于由window.open()或window.createPopup()方法初始化的窗口的限制。对于一个阻拦的IE浏览器窗口(利用window.open()方法)或一个无阻拦的IE浏览器窗口(利用window.createPopup()方法)的创建,脚本能够调用相同的方法。然而,需要去确保设计弹出窗口适合于显示给用户或者状态栏能准确地显示信息。
下面是在运行Windows安全限制特征时,对于脚本初始化窗口调用的指导方针。
对于使用window.open()打开的窗口:
去呈现状态栏并为它编码。状态栏将被默认开启,它的高度是20-25pixels。
调整你的窗口尺寸和内容让它看起来更好的适合于整个窗口的大小。不要让窗口挡住任务栏,因此你必须留出40pixels来保证状态栏和任务栏都正常显示。垂直方向上窗口离任务栏不要超过30pixels。
不要打开偏离屏幕的窗口-否则将调整窗口的X,Y参数来使它完整显示在屏幕中。
在以前,窗口的显示受显示的主题,字体的大小以及解决方案,因此当你设计窗口时,也可能需要考虑这些用户界面的影响。
注意:设置了fullscreen=yes的window.open()将会打开一个最大化的窗口,而不是一个亭子模式的窗口。
对于使用window.createPopup()打开的窗口:
调整你的窗口尺寸和内容让它看起来更好的适合于整个窗口的大小。在这个新特征下,窗口将不会挡住它的父窗口的标题栏或状态栏,因此它可能得需要40pixels留给标题栏或状态栏。窗口的垂直尺寸不能大于当前页面的可见区域。
不要打开一个无阻拦的窗口飘在IE浏览器显示HTML区域的外面-否则将调整X,Y参数来使窗口完整显示在客户端区域内。在这里存在一个异常:在窗口一半的地方,它能够在IE浏览器左边缘或右边缘的外边显示。
在以前,窗口的显示受显示的主题,字体的大小以及解决方案,因此当你设计窗口时,也可能需要考虑这些用户界面的影响。
一般提示
在SP2中检测IE浏览器
在SP2中你可以通过window.navigator.userAgent来检测连接到你的站点的浏览器是否是IE。
var g_fIsSP2 = false;
function browserVersion()
{
g_fIsSP2 = (window.navigator.userAgent.indexOf("SV1") != -1);
if (g_fIsSP2)
{
//This browser is Internet Explorer in SP2.
}
else
{
//This browser is not Internet Explorer in SP2.
}
}
如果User Agent字符串为"SV1",那么浏览器肯定是IE。
你的站点使用showModalessDialog()或showModalDialog()调用吗?
通过这两种方式作一个尝试,不要创建实例去使用ActiveX控件,自动下载文件或者自动弹出窗口。在这种情形下内容被拦截时信息栏将不被显示,用户也没有便捷的方式来允许这些内容。建议通过IE来初始化这些行为。
当内容被拦截你的站点是否转向了另一个页面?
在浏览器拦截了ActiveX控件,文件下载或弹出窗口尝试不要去转向到另一页,这种情况下,浏览器可能不会在转向后的页面显示信息栏,用户将不能方便的看到内容。