IE下的一個安全BUG —— 可實時跟蹤系統鼠標位置


  IE下的DHTML有各種M$的私有特征,已經是眾所周知。其中有個比較有趣就是:event.screenX和event.screenY,可以獲得系統級別的鼠標位置坐標。

  咋一聽,其實也覺得沒什么。屏幕上的坐標無非就是:瀏覽器客戶區域里的坐標 + 瀏覽器窗口坐標 + 客戶區偏移,僅此而已。

  IE本身就可以通過event和screen對象得到各種屏幕和窗體位置有關的信息。

  然而,真正詭異的事還沒開始!按照標准的DOM模型定義,只有在觸發某個事件的時候,才能從event中獲得與該事件相關的參數。

  也就是說,只有觸發mousemove,等這類mouseXXX鼠標事件時,才有權獲取和鼠標有關的參數。然而,在萬惡的IE下,任何事件觸發后,都能獲取event.screenX和event.screenY,甚至在頁面最小化時!

  當然,你可能會說這還是需要依賴一個事件。然而,這里的事件可以是任意的onxxx這類回調函數,並非局限於UI事件。於是,我們可以人為的制造它!

  最簡單的例子,給一個new Image設置一個無效的src,它的onerror事件立馬就觸發了!

  於是我們可以在onerror里獲取event.screenX,然后繼續設置無效的src,再次觸發onerror。。。於是我們就可以實時跟蹤用戶屏幕級別的鼠標指針了。因為onerror的產生不限於任何UI消息,因此頁面最小化或非活動狀態下,事件仍然能夠觸發!

  測試地址:http://www.etherdream.com/FunnyScript/CursorPosTest.html

  至於能不能獲取鼠標或鍵盤哪個鍵被按下,很不幸,真的不可以。如果捕捉全局按鍵,哪豈不是可以監聽密碼輸入了。。。

  事實上,onerror這類非UI事件的觸發,根本就沒有任何鼠標或鍵盤參數傳入瀏覽器窗體,所以也就無法獲取各種鼠標鍵盤信息。至於event.screenX,唯一的解釋估計它是event的一個Getter,內部直接調用了GetCursorPos這個Win API,並非事件的觸發者提供了這屬性。

  如果某個頁面植入了這樣的跟蹤代碼,然后將坐標位置通過socket.io實時傳送回來,豈不是很有趣。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM