Windows XP Service Pack 2中快顯視窗攔截器的研究

來源:互聯網
上載者:User

1 引言
1.1 研究背景
微軟公司於2004年8月份正式發布了耗資龐大的Windows XP Service Pack 2(英文版),這不是一次簡單的補丁打包升級,而是融入了眾多新技術的Windows系統更新。微軟聲稱SP2解決了以往的眾多系統漏洞並且大大加強了Windows的安全性。對於Web開發人員來說,值得關注的是SP2在IE中加入了Pop-up(快顯視窗攔截)功能,這將影響到世界上絕大部分使用快顯視窗的網站。雖然此前在Netscape等瀏覽器已加入了此項功能,並且Google以及中國的搜尋公司Baidu推出的工具列中也包含了這個功能,但是對於佔據大部分市場份額的IE來說,這次升級是影響重大的。因為佔據了瀏覽器市場80%份額以上的IE,每一個網站都不得不小心奕奕地使用快顯視窗。

1.2 參考資料
1) Microsoft Windows XP Service Pack 2 功能變更  http://www.microsoft.com/china/technet/prodtechnol/winxppro/maintain/sp2chngs.mspx
2) 微調您的 Web 網站以適應 Windows XP Service Pack 2 http://www.microsoft.com/china/MSDN/library/Windev/WindowsXP/USdnwxpxpsp2web.mspx
3) Windows XP Service Pack 2 針對開發人員的培訓  http://msdn.microsoft.com/security/productinfo/XPSP2/introduction.aspx
4) MSDN http://msdn.microsoft.com  http://www.microsoft.com/china/msdn/


2 項目概述
2.1 研究目的
研究Windows XP Service Pack 2中IE的Pop-up Blocker特徵和原理,找到網站的快顯視窗在IE(SP2)下的解決措施。

2.2 測試環境
Windows XP Professional Version 2002 + Service Pack 2
Internet Explorer 6.0.2900.2180

2.3 項目周期
2004年8月26日-9月20日
40小時左右

3 項目內容
3.1 Windows XP SP 2簡介
Windows XP Service Pack 2對作業系統做了許多重大改進增強了個人電腦的安全。它能夠通過四個方式來抵禦通常的攻擊,網路保護,記憶體保護,增強電子郵件安全性以及更加安全地瀏覽Internet。另一方面,Service Pack 2提供了更加方便的系統更新程式。管理員能夠更加容易地控制商業網路安全,使用者可以方便的使用藍牙裝置。Service Pack 2還包括了DirectX 9和Windows Media Player 9,它們包括了安全,效能和功能的改進。

通過 Windows XP Service Pack 2 (SP2),Microsoft 引入了一組安全技術,這些技術將有助於提高基於 Windows XP 的電腦抵禦病毒和蠕蟲惡意攻擊的能力。這些技術包括:
• 網路保護
• 記憶體保護
• 增強電子郵件安全性
• 更安全的瀏覽

3.2 Pop-up Blocker

Windows XP SP2在Internet Explorer中增加了Pop-up Blocker(快顯封鎖程式),它可以阻止或屏蔽大部分的快顯視窗。對於由終端使用者點選連結開啟的視窗不會被影響,另外來自本地網和信任網站域的快顯視窗也不會被阻止。

Pop-up Blocker預設為開啟狀態,這樣可以阻止自動開啟和在後台開啟的快顯視窗,但是使用者點選連結開啟的視窗仍然可以正常顯示。

啟用 Pop-up Blocker
可以使用三種不同的方法啟用 Pop-up Blocker。
• 第一次出現時的提示
在第一個快顯視窗出現之前出現提示,詢問使用者是否啟用 Pop-up Blocker。
• “工具” 菜單
在 Internet Explorer 中,在 工具 菜單上,點擊 屏蔽快顯視窗, 然後點擊 阻止快顯視窗.
• Internet 選項.
在 Internet Explorer 的 工具 菜單上,點擊 Internet 選項,點擊 隱私 選項卡,然後點擊 屏蔽快顯視窗。然後點擊選項,對 Pop-up Blocker 加以設定。
 
當一個快顯視窗被屏蔽時:
當一個網站的快顯視窗被屏蔽時,會在狀態列上顯示一個通知和播放一個聲音,而且將在顯示地區上邊地址欄下邊顯示資訊列(您可以不播放聲音和顯示資訊列,參見後面的進階設定選項)。點擊狀態列上的通知,可以看到一個帶有如下選項的菜單:
• 顯示被阻止的快顯視窗。重新載入快顯視窗。
• 允許來自該網站的快顯視窗。將當前網站添加到 “允許” 列表。
• 阻止快顯視窗。開啟或關閉 Pop-up Blocker。
• 快顯視窗選項。開啟 “ 快顯視窗管理” 視窗。
 
資訊列則會顯示快顯視窗被屏蔽訊息並通知使用者可以通過點擊資訊列允許快顯視窗和其他設定:
• 顯示被阻止的快顯視窗。重新載入快顯視窗。
• 允許來自該網站的快顯視窗。將當前網站添加到 “允許” 列表。
• 設定是否阻止快顯視窗和顯示資訊列以及更多進階設定。
• 資訊列協助。


進階設定選項
信任網站列表
終端使用者和IT管理員能夠通過將一些網站加入信任網站列表從而允許這些網站的自動快顯視窗。

過濾層級設定和其他選項
三種過濾層級:
 進階:阻止所有的快顯視窗(可以通過按住ALT鍵點選連結開啟視窗)
 中級:阻止大部分自動快顯視窗(預設層級)
 低級:允許安全網站的快顯視窗
其他選項:
 當一個快顯視窗被屏蔽時是否播放一段聲音
 當一個快顯視窗被屏蔽時是否顯示資訊列

*以下內容除非特別標註,否則都是在Pop-up Blocker的預設設定下。

阻止機理
Pop-up Blocker會屏蔽除了除createPopup()(IE5.5及以上版本支援,參見附錄)之外的從指令碼自動開啟的任何視窗。受此影響的一些常用函數是:window.open(), showModelessDialog(), showModalDialog(), showHelp(), window.external.NavigateAndFind()。

檢查方法
在已有的資料中,微軟還沒有提供可以檢測使用者是否開啟了IE Blocker的功能,只是提供了如何檢查視窗是否被阻止的方法。

對於window.open()開啟的視窗,當視窗被阻止,那麼函數將返回空值。當彈出被阻止時,在使用 window.open() 的傳回值來避免指令碼錯誤之前,請始終對該值進行檢查。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <title>Popup Tester</title>
   <script language=javascript >
    function openWin()
    {
     var sReturn = window.open("http://www.creative.com");
     if (sReturn == null)
     {
      ErrorLog.innerHTML = "Pop-up blolcked.<br />The window object return <font color=red>" + sReturn + "</font>";
     }
    }
   </script>
 </HEAD>
 <body onload="openWin()">
 <div id="ErrorLog"></div>
 </body>
</HTML>
這個例子顯示如何檢查函數傳回值來判斷用window.open()方法開啟的快顯視窗是否被阻止。

對於使用showModelessDialog(), showModalDialog(), showHelp()自動開啟的視窗,可以通過以下兩種方式來處理快顯視窗被阻止的情況:
1 如果瀏覽器版本是IE 5.0及以上,那麼就可以在Javascript代碼中使用try/catch結構來處理。如下列代碼所示:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <title>Popup Tester - Try/Catch construct</title>
 </HEAD>
 <body onload="openWin()">
  <form id="Form1" method="post" runat="server">
   <div id="ErrorLog"></div>
  </form>
 </body>
 
 <script language=javascript >
 function openWin()
 {
  try
  {
   window.showModalDialog("www.creative.com");
  }
  catch (e)
  {
   ErrorLog.innerHTML = "Pop-up blocked.<br />";
   ErrorLog.innerHTML += "Error number: " + e.number;
  }
 } 
 </script>
</HTML>
在此例中,當頁面初始化時通過openWin()函數自動開啟的視窗將被阻止,並顯示錯誤資訊和錯誤代號。

2 讓開啟視窗的函數設定Javascript錯誤控制代碼。如下所示:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <title>onerror Event</title>
 </HEAD>
 <body onload="showPopup()">
  <div id="ErrorLog"></div>
 </body>
 
 <script language=javascript >
 function handlePopupErrors(sMsg, sUrl, sLine)
 {
  ErrorLog.innerHTML = "<b>An error was thrown and caught.</b><p>";
  ErrorLog.innerHTML += "Error: " + sMsg + "<br>";
  ErrorLog.innerHTML += "Line: " + sLine + "<br>";
  ErrorLog.innerHTML += "URL: " + sUrl + "<br>";
  return false;
 }
 function showPopup()
 {
  window.onerror = handlePopupErrors;
  window.showHelp("http://www.creative.com","");
 }
 </script>
</HTML>
這個樣本證明了通過設定錯誤控制代碼來捕獲視窗被阻止時的異常資訊。和以上方法一樣,可以通過這種方式來通知使用者禁用Pop-up Blocker或將網站加入可信網站域來查看彈出內容。

一些不適當的措施
1) 根據快顯視窗被阻止而重新導向或關閉視窗
當網站快顯視窗被阻止而重新導向時,對於使用者來說,就無法通過資訊列來訪問彈出的內容。
同樣,如果某個視窗由於阻止彈出而關閉,使用者也無法看到資訊列。

2) 從快顯視窗中啟動快顯視窗
Pop-up Blocker會阻止任何自動彈出的視窗,即便是從快顯視窗中啟動新的自動快顯視窗。

3) 不要自動啟動setHomePage()對話方塊
同快顯視窗一樣,自動啟動的setHomePage()提示將被阻止。

4) 非同步請求資訊時,網站不要開啟新視窗
如果網站在非同步請求資訊後開啟特定的視窗,則 Internet Explorer 可能會阻止這些視窗,即使使用者單擊了連結以開啟該視窗。

5) 不要從ActiveX控制項或其它對象啟動快顯視窗
對於其他快顯視窗,如果視窗不是從使用者操作啟動的,那麼彈出阻止程式就會阻止它。一個視窗必須響應直接使用者操作才允許被開啟。

一般的彈出建議
• 請不要在快顯視窗失敗時進行重新導向。
• 如果快顯視窗、下載或 ActiveX 控制項被阻止,請不要關閉或自動重新導向瀏覽器視窗。如果您關閉或重新導向瀏覽器視窗,使用者將無法在“資訊列”上單擊並接受快顯視窗、下載或 ActiveX 控制項。
• 請不要從快顯視窗中啟動快顯視窗。
• 請不要從一個使用者操作啟動多個快顯視窗。
• 請不要從 showModelessDialog() 或 showModalDialog() 調用中啟動自動快顯視窗。

3.3 快顯視窗限制
請不要設定指令碼使快顯視窗的標題列,地址欄或狀態列離開螢幕可視地區之外。Service Pack 2會對使用window.open() 或 window.createPopup() 方法彈出的視窗進行限制,來確保視窗的全部資訊可見。

1 對於使用 window.open() 開啟的視窗,請保證狀態列能夠顯示,並且視窗不要覆蓋工作列。如果快顯視窗的位置在螢幕之外,視窗限制措施會調整視窗的X和Y座標,使它完全顯示在螢幕中。另外,現在,帶有 fullscreen=yes 的 window.open() 會導致最大化的視窗,而不是 kiosk 模式的視窗。無論快顯視窗的寬度和高度被設定為多少,它都會被限制在螢幕中。

註:kiosk模式是一種未顯示任何瀏覽器控制項(如工具列)的Web瀏覽器模式
 
如上圖所示,通過window.open()開啟的快顯視窗可能會覆蓋工作列或是父視窗,因此,請確保正確設計快顯視窗。

2 對於使用 window.createPopup() 開啟的視窗將不會覆蓋父視窗的標題列或狀態列,因此即使視窗的高度被設定為超過父視窗或螢幕大小,SP2依然會限制它保證父視窗的標題列或狀態列。另外,如果使用者沒有最大化父視窗,當父視窗位於螢幕的不同位置時,快顯視窗可能會在父視窗之外甚至部分或全部在螢幕之外。
 
在上圖中,通過window.createPopup() 開啟的視窗(藍色邊框,紅色背景的部分)在指令碼中被設定為寬1400,高900,但顯示時,快顯視窗被限制了高度來保證父視窗的標題列或工作列,而它的寬度則不受影響。
 
 
上兩圖則說明了當非最大化狀態的父視窗處於螢幕的不同位置時,快顯視窗可能出現的情況。

無論是哪種指令碼開啟的視窗,在設計時都需要考慮UI元素如顯示主題、字型大小和解析度等來調整視窗的顯示。

3.4 如何檢測瀏覽網站的瀏覽器是否是SP2 中的 Internet Explorer
可以使用 window.navigator.userAgent 來檢測。
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.
   }
}

如果使用者代理程式字串中包含“SV1”,說明串連到您網站的瀏覽器是 SP2 中的 Internet Explorer。

3.5 其它方面
Windows XP Service Pack 2(SP2)還對ActiveX控制項的安裝和下載檔案產生影響。

在SP2中,ActiveX 控制項的模式安裝會被資訊列阻止並提示該網站要求安裝控制項。使用者可以通過點擊資訊列來安裝ActiveX控制項。對於使用快顯視窗和HTML對話方塊來安裝 ActiveX 控制項也會被阻止。

在沒有經過使用者點擊或按鍵來啟動的檔案下載提示也會被資訊列阻止。

4 結論
Windows Service Pack 2中,Pop-up Blocker會阻止除了createPopup()之外的大部分指令碼自動彈出的視窗。可以通過函數的傳回值來判斷快顯視窗是否被阻止,並採取進一步的措施。

 

附錄:

CreatePopup() Method

Internet Explorer 5.5 支援window對象的一個新方法,createPopup()。你可以通過下面的方式建立一個快顯視窗:

var popupObj = window.createPopup();
當你建立了這個對象時視窗不會被顯示,必須調用它的方法:

popupObj.show(yOffset, xOffset, width, height, referenceObj)
其中:

yOffset 是距離螢幕左上方的水平座標位移。
xOffset 是距離螢幕右上方的水平座標位移。
width 是快顯視窗的寬度。
height 是快顯視窗的高度。
referenceObj  是一個替代螢幕左上方位置的參數,通過設定它你可以定義 yOffset 和 xOffset 相對於它的位置。

下面是一個定義了背景和邊框的快顯視窗樣本:

<SCRIPT LANGUAGE="JavaScript">
<!--
var oPopup = window.createPopup();
var oPopupBody = oPopup.document.body;
oPopupBody.style.backgroundColor = "magenta";
oPopupBody.style.border = "solid blue 3px";
oPopupBody.innerHTML = "Click outside <B>popup</B> to close.";
oPopup.show(300, 80, 200, 50, document.body);
// -->
</SCRIPT>

MSDN上關於createPopup()的參考文檔:http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/createpopup.asp

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.