2011年8月15日 星期一

[Windows] 初探 Browser Helper Object - 在特定條件下刪除 Cookie 為例

IE 附加元件


Browser Helper Object (BHO) 說穿了就像 Firefox Plugin 或 Google Chrome Extension 一樣,用來擴充瀏覽器的功能,只是實作上不同於 Firefox 跟 Chrome 的 Javascript 環境,這次使用的是 VC++ 的環境。沒想到人生中第一次實作瀏覽器 plugin 竟然是用在 IE 身上。


原先一直想用 Visual Studio Express 來實作,但裝了一陣子後,雖然可以透過 Windows Driver Kit (WDK) 來補齊 Active Template Library (ATL) 所需的 header file 或 library ,但最後看到的教學要新增一個 ATL Simple Object 時,卡關了,最後還是乖乖使用 VS 系列了。


關於範例就請直接參考 MSDN 官網:


Building Browser Helper Objects with Visual Studio 2005



來源:http://msdn.microsoft.com/en-us/library/bb250489(v=vs.85).aspx


官網寫得非常夠用!上述例子是當網頁讀完後(OnDocumentComplete),彈跳出一個視窗,如果熟悉 jQuery (或Javascript) 的話,就類似 $(document).ready(function(){ alert("Hello World!"); }); 效果。簡單地說,透過瀏覽器的事件偵測,可以玩很多好玩的東西。


由於周邊有人有這樣的需求,我就好奇播一點時間研究了一下。目前的需求:


在特定的 URL 下,刪除特定網域的 Cookie


這樣的行為基於安全性的設計,本來就是不允許的 :P 但透過安裝 BHO 後,可以刪除不同網域的 cookie 資料。所以啊,亂裝 BHO 是很危險的,並且 IE 又是 Windows 核心啊。


寫法只需更改 OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL) 部分:


void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
    // Retrieve the top-level window from the site.
    HWND hwnd;
    HRESULT hr = m_spWebBrowser->get_HWND((LONG_PTR*)&hwnd);
    if (SUCCEEDED(hr))
    {
        // Output a message box when page is loaded.
        //MessageBox(hwnd, L"Hello World!", L"BHO", MB_OK);

        if ( wstrcmp( pvarURL->bstrVal , L"http://www.google.com.tw/" ) == 0 )
        {
            InternetSetCookie( "http://localhost" , "MyCookieName" , "MyCookieValue; expires=Thu, 01-Jan-1970 00:00:01 GMT" );
        }
    }
}


別忘了要引用相關函式庫:


#pragma comment(lib,"Wininet.lib")

#include <Wininet.h>


整個效果就是當瀏覽器瀏覽到 http://www.google.com.tw/ 時,對 http://localhost 網域進行設定 Cookie 的動作,由於設定的 expire time 已超過,等同於刪除指定的 cookie 資訊。這樣的清除 cookie 技巧可以用再強制幫使用者登出等等。


1 則留言:

  1. 請問你可以幫我編譯DLL檔嗎!? 謝謝

    版主回覆:(02/28/2012 10:18:08 AM)


    哦,這裡不提供這樣的服務喔 XD 如果你 code 都寫好了,你可以去安裝 Visual Studio Express 版本,在加上 Windows DriverKit,這些都是免費的。至少編譯應該可以過。但如果你要重新寫 code (例如新增 ATL Simple Object),那大概就不行了。

    回覆刪除