2013-02-22 59 views
0

我正在構建一個使用(動態插入)JavaScript修改網頁的工具。任何網頁。導航後立即執行代碼:瀏覽器插件?

這個想法是允許用戶使用它來記錄對現有網頁(如google.com)的一系列更改(例如,假設更改是將10像素純黑色邊框應用於所有<img>標籤,這種變化顯然可以編碼爲jQuery的簡短小貼士),如果您願意(在這種情況下爲google.com),該工具會生成一個包含此元數據和表示「起點」的url的鏈接(或標識符)。

現在我遇到的問題是整個同源安全策略,其目的是明確否認它看起來像我需要做的確切類型的事情。

我需要做的是本質上導航到一個特定的網站,然後在該網站的上下文中執行JavaScript。我(工具的作者)以及我與我分享我的腳本的用戶都不必控制站點,因此理論上,安全模型如果得到正確實施,應該可以防止這個概念發揮作用。

正因爲如此,我不能有一個單一的可點擊的鏈接,啓動一些網站上運行我的代碼的過程。這完全有意義。如果攻擊者網站發送一個變相的可點擊鏈接,它將運行代碼,在任何他們想要的網站上扮演我的角色,這將變得微不足道。

但是,解決此問題的方法是告訴收件人執行單個附加步驟。首先,他們像通常一樣打開網站的URL,然後他們將一點點javascript:(function(){.....})();粘貼到URL/omni欄中。這是(AFAICT)完全合法的,應該是允許的,因爲用戶知道這個腳本正在執行。現在是否應該允許它輕鬆運行JS或多或少不相關,因爲它現在基本上都可以工作。

這並不算太壞,但我認爲用戶體驗不必要地受到影響。例如,它看起來像一個本地應用程序將有必要獲得比將iOS粘貼到iOS設備上的URL欄更好的效果,但是在插件接受的完整瀏覽器上,它看起來像一個插件可以實現我想要的效果。

這是一個導航到一個任意的URL,然後執行代碼(這個代碼來自一個授權的源代碼)只需點擊一下。

但我不確定從哪裏開始。什麼API可以爲我提供這種能力?我希望能夠脫離Greasemonkey類型的腳本(因爲Greasemonkey兼容插件幾乎適用於所有優秀的瀏覽器),但我不知道是否有足夠的可用功率。

對於與安全相關的問題,我仍然有點不確定。我以前在這裏有一個很大的段落,但這一切都歸結爲「社會工程」。

回答

0

這種東西通常用bookmarklets完成。

在您的網站上使用您的腳本,創建一個具有href="javascript:(function(){/* ... */})()"的鏈接。然後,用戶可以簡單地將該鏈接拖放到他的收藏夾中(書籤)。並將其用作收藏夾欄中的按鈕。

您的書籤可以直接包含您的腳本,也可以是一個簡單的加載程序,它將一個<script src=http://mywebsite.com/script.js">標籤注入到文檔中,這樣您就可以更新腳本並將其「分發」給所有用戶。

+0

哦,我喜歡那樣!在服務器端更新腳本。那裏有好的見解。 – 2013-02-22 16:30:15

0

安全始終關乎知識。或者換句話說:不瞭解某些東西會讓你感到不安全。

沒有安全的方法來做你想做的事情,這是我的Web瀏覽器在默認情況下禁止它。有一些解決方法(如上面解釋的那樣粘貼URL),但只要用戶知道她在做什麼,所有這些都是安全的。

這就是社會影響。現在技術方案:

  1. 您嘗試bookmarklet
  2. 您可以使用瀏覽器插件一樣Greasemonkey

兩者都允許運行任意JavaScript。前者每次需要用戶明確許可,後者自動執行。當然,如果將功能的核心移動到一個偏遠的地方,即使像我這樣的知識淵博的用戶也很難理解和信任正在發生的事情。

這就是當函數的肉不在書籤或書籤中,而是用一個遠程URL添加<script>標籤時。這會讓你很難確保你的腳本不會做一些「奇怪」的事情。例如,當我嘗試在不使用書籤的情況下下載JavaScript時,您可能會返回不同的腳本。

+0

Greasemonkey可以自動執行非預定的代碼嗎?它允許這樣的事情嗎?用戶A需要發送給用戶B(擁有Greasemonkey)多個不同的腳本/配置鏈接,我希望用戶B能夠在不單獨安裝它們的情況下執行它們(如小書籤或將腳本粘貼到URL欄中所需)。 – 2013-02-22 16:28:45

+0

你可以在greasemonkey中做一個AJAX請求,並在成功結果上調用'eval()'嗎? – 2013-02-25 12:55:28

+0

是的,但僅此而已。 – 2013-02-25 13:20:44