JScript 的安全性考量
更新:2007 年 11 月
對任何語言而言,撰寫安全的程式碼都是一項挑戰。JScript 有幾個領域,可能會使開發人員在渾然不知的情況下,以不安全的方式使用語言,因為該語言沒有強迫開發人員使用最有效的作法。雖然 JScript 是以安全性為目標設計而成的,但促進快速開發有用的應用程式才是其首要目標。在某些情況下,這兩個目標卻是對立的。
如果您已經知道有一些主要領域 (如下所列) 可能會發生問題,便可免除安全性問題的產生。除了 eval 方法外,這些安全性考量都是基於 .NET Framework 所帶來的新功能。
eval 方法
JScript 最容易誤用的功能是 eval 方法,因為它能動態執行 JScript 原始程式碼。因為使用 eval 方法的 JScript 應用程式會執行程式傳遞給它的任何程式碼,所以每次呼叫 eval 方法都有安全性風險。除非您的應用程式需要能夠執行任何程式碼的彈性,否則便需考慮明確地將應用程式傳遞至 eval 方法的程式碼寫入。
對需要 eval 方法所提供完整彈性的應用程式而言,為了提高其安全性,傳遞給 eval 的程式碼會預設為在受限制的執行環境中執行。受限制的安全性內容可以防止所有對系統資源的存取,例如檔案系統、網路或使用者介面。如果程式碼嘗試存取這些資源,便會產生安全性例外狀況。但是,eval 方法所執行的程式碼仍可修改區域和全域變數。如需詳細資訊,請參閱 eval 方法。
利用舊版 JScript 所寫成的程式碼可能需要 eval 方法,才能在與呼叫程式碼相同的安全性內容下執行程式碼。若要啟用這項行為,可將 "unsafe" 字串以選擇性的第二個參數傳遞至 eval 方法中。您應該只執行從已知來源取得的程式碼字串,因為在 "unsafe" 模式下,該程式碼字串會以與呼叫程式碼相同的權限執行。
安全屬性
.NET Framework 的安全屬性 (Attribute) 可用於明確覆寫 JScript 預設的安全性設定。但是,除非您十分清楚整個操作過程,否則不要擅自修改這些安全性預設值。您尤其不應套用 AllowPartiallyTrustedCallers (APTCA Attribute) 的自訂屬性,因為未受信任的呼叫端通常無法安全地呼叫 JScript 程式碼。如果您利用 APTCA 建立信任的組件,然後由應用程式載入這個組件,部分信任的呼叫端便可存取此應用程式中完全信任的組件。如需詳細資訊,請參閱安全程式碼撰寫方針。
部分信任的程式碼和裝載的 JScript 程式碼
裝載 JScript 的引擎允許任何被呼叫程式碼修改該引擎的部分內容,例如全域變數、區域變數和任何物件的原型鏈結。除此之外,任何函式都可修改傳遞至它的所有 expando 物件之 expando 屬性 (Property) 或方法。因此,如果 JScript 應用程式呼叫部分信任的程式碼,或在含有其他程式碼 (例如 Visual Studio for Applications [VSA] 主應用程式中的程式碼) 的應用程式中執行,則該應用程式的行為可能會被修改。
如此一來,應用程式 (或 AppDomain 類別的執行個體) 的任何 JScript 程式碼,應在低於該應用程式其他程式碼所屬信任層級中執行。否則,其他程式碼會操作 JScript 類別的引擎,進而修改資料,並影響應用程式的其他程式碼。如需詳細資訊,請參閱 _AppDomain。
組件存取
JScript 可以使用強式名稱 (Strong Name) 和簡易文字名稱 (Simple Text Name) 參考組件。強式名稱參考包含組件的版本資訊,以及確認組件完整性和身分的密碼編譯簽章。雖然在參考組件時,使用簡易名稱較容易,若系統中的其他組件有相同的簡易名稱但功能不同,強式名稱可幫助保護您的程式碼。如需詳細資訊,請參閱HOW TO:參考強式名稱簽署組件。
執行緒處理
JScript 執行階段並未設計成安全的執行緒。因此,多執行緒 JScript 程式碼可能會產生無法預期的行為。如果您是在 JScript 中開發組件,請切記這個組件可能會用於多執行緒的內容中。您應該使用 System.Threading 命名空間中的類別 (例如 Mutex 類別) 以確保組件中的 JScript 程式碼會以適當的同步處理執行。
由於在任何程式語言中都很難適當的撰寫同步程式碼,因此不應嘗試使用 JScript 撰寫一般用途的組件,除非您非常瞭解如何實作必要的同步程式碼。如需詳細資訊,請參閱 System.Threading。
注意事項: |
---|
您不需為使用 JScript 寫成的 ASP.NET 應用程式撰寫同步程式碼,因為 ASP.NET 會管理所有它產生之執行緒的同步處理動作。但是,以 JScript 寫成的 Web 控制項必須包含同步程式碼,因為 Web 控制項的行為會與組件一樣。 |
執行階段錯誤
因為 JScript 是一種型別鬆散的語言,與其他語言 (例如 Visual Basic 和 Visual C#) 相較,對可能發生型別不符的相容度較高。由於型別不符會導致應用程式發生執行階段錯誤,因此最好能在開發程式碼時,就發現可能的型別不符情況。您可使用 /warnaserror 旗標及命令列編譯器,或 ASP.NET 網頁中 @ Page 指示詞的 warninglevel 屬性。如需詳細資訊,請參閱 /warnaserror 和 @ Page。
相容性模式
與快速模式 (預設模式) 下編譯的組件相比較,相容模式 (使用 /fast- 選項) 下編譯的組件加密程度較低。/fast- 選項可啟用語言功能,此功能預設為不可使用,但為了與以 JScript 5.6 版和舊版所撰寫之指令碼相容,此功能是必要的。例如在相容性模式下,可動態地將 expando 屬性新增至內建物件 (如 String 物件) 中。
提供相容模式,協助開發人員根據舊版 JScript 程式碼,建置獨立的可執行檔。在開發新的可執行檔或程式庫時,請使用預設模式。如此不僅可幫助保護應用程式,也幫助提供更佳的效能,並與其他組件有更好的互動。如需詳細資訊,請參閱 /fast。