最近工作上遇到了一個問題,因為我們部門原本寫的程式都是 client-side 的應用程式,後來也開發了一些網頁程式,還做了一個網頁 portal,把所有的程式連結都放到這個 portal 上。而原本公司內部的電腦預設都是 IE 瀏覽器,所以很簡單的就可以用 ActiveXObject 的 ShellExecute 來開啟執行檔。
只是這個用法最近開始出現問題,起因於 IE 瀏覽器的漏洞實在太多,再加上 WinXP 的 EOS (End of Support) (可是我們公司又一堆 XP + IE8),所以公司擋掉 IE8 可以上網的功能,而既有的 XP 使用者想上網就只能用 Chrome,這讓用我們網頁的 XP 使用者,被迫要在 IE 跟 Chrome 間不斷切換,這是引發一部份民怨的第一階段。
後來 IE 漏洞越來越多,而且越來越恐怖,後來內部政策乾脆連 ActiveX 的執行權限強制關掉,這個動作可就麻煩了,等於是我們原本用網頁開啟執行檔這條路就完全被斷了,等於是把我們部門的系統給廢了八成,這引發了很大一部份的民怨。
不過既然這是公司目前的 IT 政策,在沒有長期解決之道的情況之下,我們也只能吞下去,並且先自行開始找短期解法。上網找了一些討論串,有的說無解,有的說要寫 Chrome plugin,有的則是雜七雜八的聊天。後來看到一個討論,是透過 Windows 原本自己的 Custom URL Protocol 來解決,很簡單就可以使用,而且是可以解決在 Chrome 上啟動執行檔的問題。
何謂 Custom URL Protocol?其實我們在使用 Windows 的時候,每次看到 http 開頭的 URL,點下去,系統就會自動開啟 IE 瀏覽器。http 就是一種 URL Protocol,它讓系統知道,看到 http: 開頭的字串,就去開 IE,然後把後面的字串丟到 IE,讓 IE 去開啟網頁。除了 http: 之外,常見的還有 file:, ftp:…等,所以我們就是利用這樣的行為,去設定一個自訂的 URL Protocol,例如說自訂 XXX: Protocol 跟對應要用哪個程式去啟動。只要我們寫了 XXX:,那系統就會去呼叫我們設定好的程式起來執行。
要定義這樣的行為動作,我們必須加入一些註冊碼到 HKCR 或是 HKCU\Software\Classes,不過以上註冊碼是給 x86 系統使用。如果是 x64 的機器的話,設定在這樣的路徑下,可是只有 64 位元的程式可以使用,如果要讓 32 位元的程式也可以用,則是要放在 HKLM\Software\Wow6432Node\Classes 或是 HKCU\Software\Wow6432Node\Classes 下面才可以喔。
要加入的註冊碼如下:註冊碼的意思就是定義一個 XXX 的 protocol,去開啟記事本 (notepad.exe),
[HKEY_CLASSES_ROOT\XXX]
@="ULR:alert Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\XXX\Shell]
[HKEY_CLASSES_ROOT\XXX\Shell\Open]
[HKEY_CLASSES_ROOT\XXX\Shell\Open\Command]
@="\"c:\\windows\\system32\\notepad.exe\" \"%1\""
所以我們只要在使用者的電腦,設定好一組 Custom URL Protocol,然後再將我們網頁開啟執行檔的連結,全部用這一組 Custom URL Protocol 當作預設的協定,之後當使用者用 Chrome 點連結的時候,就可以成功開啟執行檔了。
雖然目前看起來這個解法可以解決我們的需求,只是這個解法我個人認為是打開另一個漏洞,所以也不敢貿然使用,先提出來,等 IT Security Audit 的人來決定可不可以走這一條路吧,如果不行的話,就讓公司專業的 IT 來跟我們講怎麼解了。
參考連結:
Registering an Application to a URI Scheme
Custom URL Protocol Handlers
沒有留言:
張貼留言