天天看點

《JavaScript精粹(修訂版)》——1.2 JavaScript的限制

本節書摘來自異步社群《javascript精粹(修訂版)》一書中的第1章,第1.2節,作者:【英】edwards, j. , 【澳】adams, c.著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

javascript通常被作為一種用戶端語言使用,這裡所說的用戶端,一般是指終端使用者的web浏覽器。在浏覽器中,javascript代碼被解釋并被執行,這一點和服務端語言截然不同。所謂的服務端語言需要運作在伺服器,并發送一些靜态資料給用戶端,例如php、asp等。

由于javascript根本無法和伺服器的環境打交道,很多任務是通過php實作的,例如讀寫資料庫,或者建立一個文本檔案等。不過因為javascript可以與用戶端環境互動,是以它能夠根據用戶端資訊來做一些判斷或操作,例如滑鼠位置、元素的尺寸等,而這是服務端語言無法做到的。

什麼是activex?

如果您對微軟的jscript已經很熟悉了,那麼可能會想到“javascript也許可以通過activex做些什麼事”。沒錯,确實可以,不過activex并不是ecmascript的一個組成部分。activex隻是windows作業系統的一種特别機制,以便internet explorer可以通路com對象,而且通常activex是運作于受信任的環境中的,例如intranet。我們會很快遇到幾個例外:internetexplore中沒有專門的安全設定的activex控件(例如flash插件,還有xmlhttprequest)。但絕大多數情況下,對activex的讨論不在本書範疇之内。

通常,在任何一台計算機上運作的用戶端的能力總是沒有伺服器端強大,是以,javascript并不适合用來進行大量資料的處理。但是它對少量資料的即時處理能力對于用戶端而言卻有着莫大的吸引力,例如接受響應、驗證表單等,這使得它成為一個完成此類任務的最佳選擇。

但是,試圖評價伺服器端語言和用戶端語言的優劣卻是不必要的。這兩種語言不具有可比性,它們隻是針對不同任務的工具而已,兩者的交集也并不多。然而,對于用戶端腳本和伺服器腳本的互動能力的需求卻導緻新一代web腳本語言的産生,這種新腳本語言使用xmlhttprequest來請求伺服器資料,運作伺服器端的腳本,同時在用戶端處理結果。第18章将深入探讨這種技術。

安全性限制

正因為javascript可用于操作那些非常敏感的資料和程式,是以它的能力被嚴格地限制,以防止被人惡意使用。是以,javascript被禁止去做很多的事情。例如,它不能讀取計算機的系統設定,不能操作硬體,也不能啟動别的程式。

一些本來在javascript中被禁止的特殊的互動在特定的頁面元素中也可以被允許。例如,修改< input>的值通常是沒什麼問題的,除非是一個檔案上傳區(例如,< input type="file">),往裡面寫入是被禁止的,因為這可以阻止惡意代碼偷偷地讓使用者上傳他本來不希望上傳的檔案。

還有很多類似的限制,本書将通過大量的例子和應用一一展示。但這裡還是可以簡單地總結一下,下面列出了javascript中由于安全問題而被禁止的操作:

不能打開和讀取檔案(除非在特别的環境之下,相關内容會在第18章讨論);

不能在使用者的計算機上建立和編輯檔案(除了cookie,相關内容在第8章讨論);

不能讀取http post資料;

不能讀取系統設定,或者使用者計算機上的任何其他資料,除非是語言本身提供的資料或者是環境提供的宿主對象(host object)1;

不能修改文本輸入區域的值;

不能修改從其他域載入的document的顯示方式;

不能關閉和修改工具欄或者其他任何沒有向腳本開放的視窗元素。

結果,javascript好像被禁止了太多的功能。

另外,還有一點值得注意。很多浏覽器提供了更加精細的權限控制,而不僅僅是一個允許或禁止的選項。例如,opera可以禁止腳本關閉視窗,禁止移動視窗,禁止狀态欄寫入,禁止接收滑鼠右鍵消息……這個清單還可以列得更長。加上了這些限制,您能做的事情就更少了,不過通常不需要關心那些選項,在大多數情況下,那些選項是為了對付一些煩人的代碼(走馬燈式的滾動狀态欄、禁止右鍵的腳本等)而準備的,是以如果不想寫那些讓人讨厭的腳本,這些限制完全不用放在心上。