JavaScript 覆寫原生方法 overwrite native method

  • 3295
  • 0

摘要:JavaScript 覆寫原生方法 overwrite native method

如果你認為 eval is evil,可以透過覆寫 eval禁止使用…

當然,在正式環境這樣用一定會出事,沒有人用 eval就算了,真有人用,讓別人的程式壞掉還不被打嗎XD

程式要告知使用者執行結果,或其他訊息,可能會使用 alert,如果覺得 alert很醜、很礙事、很不友善,也可以覆寫 alert

但是 alert有些特性無法模擬,像是暫停 script執行,或是讓 alert依序一個一個執行在實作上也有點麻煩,還有阻擋滑鼠繼續點擊頁面之類的…所以這個想法只做完覆寫就不玩了XD;剩下可以勝出原有 API的部分我只想到 UI調整,讓每個瀏覽器 alert的介面相同…但這部分要勝過 jQuery UI要做的事更多…不如直接拿 jQuery UI來用XD

然後是本文的起源了…(是的,前面都是引申XD),剛剛想覆寫 document.write,記錄每次 write的內容,所以我寫了這個

但是這中間我遇到一個無法瞭解的錯誤

(function(doc) {
    doc.write(123);
    var _write = doc.write;
    _write.apply(doc, [123]);
    //_write(123); //CHROME: Illegal invocation,為什麼?如果是安全性考量,為什麼透過 apply又可以執行?
})(document);

附註:覆寫原生方法最初是在網路攻擊的文章裡面看到的,script file注入其他網站之後可以透過這樣的方式發動攻擊…一個防守的方法是透過建立 iframe產生乾淨、安全的環境,再用這裡面的原生方法,繞很大一圈,而且防守重點應該放在避免被注入啊~!