如果您當過 Web CGI 腳本程序員,那么一定知道必須注意傳遞給 ScriptEngine 的 eval() 方法的東西。腳本引擎會立即執行傳遞給 eval 方法的代碼。因此,絕不要把來自不可信來源的字符串或 Reader 對象傳遞給腳本引擎。
例如,假設我們使用腳本編程 API 遠程監視一個 Web 應用程序。我們讓腳本引擎能夠訪問關鍵的 Java 對象,這些對象提供 Web 應用程序的狀態信息。還創建一個簡單的 Web 頁面,這個頁面接受任意腳本表達式,它將這些表達式傳遞給腳本引擎進行計算并在 Web 頁面上顯示輸出。這樣就可以對正在運行的 Java 對象進行查詢并執行對象上的方法,從而幫助判斷應用程序的狀態。
但是,在這種情況下,能夠訪問這個 Web 頁面的任何人都可以執行任意腳本語句,可以訪問任意共享 Java 對象。編程時的失誤、錯誤的配置和安全漏洞會把機密信息泄露給未授權用戶,或者讓應用程序遭遇拒絕服務攻擊(例如,攻擊者可以執行與 System.exit 或 /bin/rm -fr / 等效的腳本語句)。與任何強大的工具一樣,Java 腳本編程 API 要求您保持謹慎,注意安全。
進一步開拓的方向
本文主要關注讓 Java 應用程序能夠在運行時動態地讀取并執行外部腳本,以及讓腳本能夠訪問顯式提供給它們的 Java 對象。Java 腳本編程 API 還提供了其他特性。例如:
可以使用腳本語言實現一個 Java 接口,然后像使用任何其他 Java 接口引用一樣從 Java 代碼調用腳本代碼。
可以在腳本中實例化并使用 Java 對象,還可以讓 Java 應用程序能夠訪問這些對象。
可以在裝載動態腳本時進行預編譯,這可以讓以后的執行過程更快。
可以設置腳本使用的輸入流和輸出流,這樣就很容易將文件用作腳本的控制臺輸入源,以及將腳本的控制臺輸出轉發到文件或其他流。
可以設置位置參數,腳本可以將這些參數用作命令行參數。
分享這篇文章……
提交到 Digg
發布到 del.icio.us
提交到 Slashdot!
Java 腳本編程 API 定義了腳本引擎可以選擇實現的一些功能,所以并非所有腳本引擎都提供這些功能。在 參考資料 中可以找到關于這些特性和其他特性的讀物和在線參考資料。
文章來源于領測軟件測試網 http://www.kjueaiud.com/