一種增強JavaScript函數(shù)封裝性的方法
【專利摘要】本發(fā)明公開了一種增強JavaScript函數(shù)封裝性的方法,包括如下步驟:附加訪問權限控制符到JavaScript函數(shù),定義JavaScript函數(shù)的封裝性;根據(jù)JavaScript函數(shù)訪問權限控制符和函數(shù)封裝性定義,設計JavaScript程序預處理系統(tǒng)生成JavaScript函數(shù)的監(jiān)控代碼;運用JavaScript函數(shù)監(jiān)控代碼,在運行時監(jiān)控JavaScript程序的運行過程,阻止違反JavaScript函數(shù)封裝性定義的函數(shù)調(diào)用。本發(fā)明提供了一種安全可靠、便于程序員學習和使用的增強JavaScript函數(shù)封裝性的方法,以增強JavaScript函數(shù)的封裝性,提高JavaScript程序的模塊化和實現(xiàn)隱藏,增加JavaScript程序的安全性和正確性。
【專利說明】—種增強JavaScr i pt函數(shù)封裝性的方法
【技術領域】
[0001]本發(fā)明涉及軟件安全領域,更具體的說是涉及一種增強JavaScript函數(shù)封裝性的方法。
【背景技術】
[0002]JavaScript (語言規(guī)范是ECMAScript),是一種廣泛用于客戶端網(wǎng)頁開發(fā)的腳本語言,最早是在HTML上使用的,用來給HTML網(wǎng)頁添加動態(tài)功能,然而現(xiàn)在JavaScript也可被用于網(wǎng)絡服務器,如Node, js。不同于服務器端腳本語言(例如PHP與ASP), JavaScript主要被作為客戶端腳本語言在用戶的瀏覽器上運行,其源代碼在發(fā)往客戶端運行之前不需經(jīng)過編譯,而是將文本格式的字符代碼發(fā)送給瀏覽器由瀏覽器解釋運行,不需要服務器的支持。所以在早期程序員比較青睞于JavaScript以減少對服務器的負擔,而與此同時也帶來另一個問題:安全性。隨著服務器的強壯,雖然現(xiàn)在的程序員更喜歡運行于服務端的腳本以保證安全,但JavaScript仍然以其跨平臺、容易上手等優(yōu)勢大行其道。
[0003]函數(shù)是JavaScript程序的基本結構,JavaScript程序由一組函數(shù)組成,只有確保目標JavaScript函數(shù)安全和可靠的執(zhí)行,JavaScript程序才能被安全和可靠的執(zhí)行,不產(chǎn)生危險和惡意的程序行為。
[0004]但是目前,由于JavaScript語言的某些動態(tài)語法特性,例如函數(shù)閉包和原型繼承,缺乏有效的函數(shù)封裝性機制支持,破壞了傳統(tǒng)的軟件模塊化原則,容易引起JavaScript程序的可靠性和安全性問題。
[0005]而主流的靜態(tài)面向對象語言一般具有訪問權限控制符和完善的函數(shù)封裝性機制,如果可以借鑒主流靜態(tài)面向對象語言的封裝性機制,來設計一種增強JavaScript函數(shù)封裝性的方法,將有利于提高JavaScript程序的模塊化和實現(xiàn)隱藏,增加JavaScript程序的安全性和正確性。
【發(fā)明內(nèi)容】
[0006]為解決上述問題,本發(fā)明的目的在于提供一種安全可靠、便于程序員學習和使用的增強JavaScript函數(shù)封裝性的方法,以增強JavaScript函數(shù)的封裝性,提高JavaScript程序的模塊化和實現(xiàn)隱藏,增加JavaScript程序的安全性和正確性。
[0007]為實現(xiàn)上述目的,本發(fā)明的技術方案為:
一種增強JavaScript函數(shù)封裝性的方法,包括如下步驟:
51:附加訪問權限控制符到JavaScript函數(shù),定義JavaScript函數(shù)的封裝性;
52:根據(jù)步驟SI提出的JavaScript函數(shù)訪問權限控制符和JavaScript函數(shù)封裝性定義,設計JavaScript程序預處理系統(tǒng)生成JavaScript函數(shù)的監(jiān)控代碼;
53:運用JavaScript函數(shù)監(jiān)控代碼,在運行時監(jiān)控JavaScript程序的運行過程,阻止違反JavaScript函數(shù)封裝性定義的函數(shù)調(diào)用。
[0008]進一步的,所述步驟SI中的訪問權限控制符設置為字符A、字符B和字符C,所述JavaScript函數(shù)的封裝性定義如下:
使用字符A修飾目標函數(shù)時,允許當前函數(shù)所在范圍的語句調(diào)用目標函數(shù),禁止其它訪問控制范圍內(nèi)的語句調(diào)用目標函數(shù);
使用字符B修飾目標函數(shù)時,允許當前函數(shù)所在范圍的語句調(diào)用目標函數(shù),允許友員函數(shù)內(nèi)部范圍內(nèi)的語句調(diào)用目標函數(shù),禁止其他訪問控制范圍內(nèi)的語句調(diào)用目標函數(shù);使用字符C修飾目標函數(shù)時,允許目標函數(shù)所在范圍的語句調(diào)用目標函數(shù),允許從目標函數(shù)的外部范圍的函數(shù)原型繼承的函數(shù)調(diào)用目標函數(shù),禁止其它訪問控制范圍內(nèi)的語句調(diào)用目標函數(shù)。
[0009]優(yōu)選的,所述字符A、字符B和字符C分別設置為current、friend和inherit。
[0010]進一步的,所述步驟S2中,預處理系統(tǒng)根據(jù)目標函數(shù)的封裝性定義掃描目標函數(shù)的程序上下文,生成目標函數(shù)的監(jiān)控代碼,其具體步驟如下:
521:掃描附加訪問權限控制符的目標函數(shù),生成目標函數(shù)的包裝函數(shù);
522:用步驟S21中生成的包裝函數(shù)代碼替換源程序中的目標函數(shù)代碼;
523:在步驟S22中生成的程序前面附加對JavaScript面向方面擴展庫的調(diào)用;
524:根據(jù)目標函數(shù)的訪問權限控制符,在步驟S23生成的程序后面附加相應的授權代碼,授權代碼利用JavaScript面向方面擴展庫監(jiān)控訪問控制范圍內(nèi)的目標函數(shù)的調(diào)用,對正確的目標函數(shù)調(diào)用進行授權;
525:在步驟S24生成的程序后面附加檢查函數(shù)的定義,檢查函數(shù)的參數(shù)是目標函數(shù)名稱,測試對目標函數(shù)的調(diào)用是否正確;
526:將步驟S25生成的程序替換包含目標函數(shù)的源程序。
[0011]進一步的,所述步驟S3具體包括步驟如下:
531:當目標函數(shù)被執(zhí)行,繼續(xù)執(zhí)行步驟S32 ;
532:如果針對目標函數(shù)的調(diào)用在所述JavaScript函數(shù)的封裝性定義范圍內(nèi),繼續(xù)執(zhí)行步驟S33 ;如果針對目標函數(shù)的調(diào)用不在JavaScript函數(shù)的封裝性定義范圍內(nèi),執(zhí)行步驟 S34 ;
533:授權代碼對正確的目標函數(shù)調(diào)用進行授權,繼續(xù)執(zhí)行步驟S34 ;
534:調(diào)用包裝函數(shù),繼續(xù)執(zhí)行步驟S35 ;
535:調(diào)用檢查函數(shù),檢查針對目標函數(shù)的調(diào)用是否合法,如果針對目標函數(shù)的調(diào)用已被授權,執(zhí)行步驟36 ;如果針對目標函數(shù)的調(diào)用沒有被授權,則拋出運行時異常;
536:執(zhí)行目標函數(shù),完成后繼續(xù)執(zhí)行程序。
[0012]本發(fā)明增強JavaScript函數(shù)封裝性的方法取得的有益效果:(I)借鑒了主流靜態(tài)面向對象語言的訪問控制權限控制符和封裝性體制,可以方便熟悉主流靜態(tài)面向對象語言的程序員學習和使用;(2)增強JavaScript函數(shù)的封裝性,有利于提高JavaScript程序的模塊化和實現(xiàn)隱藏,增加JavaScript程序的安全性和正確性。
【專利附圖】
【附圖說明】
[0013]圖1為本發(fā)明的方法流程圖示。
[0014]圖2為本發(fā)明實施例中生成JavaScript函數(shù)監(jiān)控代碼的流程圖示。
[0015]圖3為本發(fā)明實施例中預處理系統(tǒng)生成的JavaScript源程序(目標函數(shù)變成其wrapper函數(shù))和監(jiān)控代碼。
[0016]圖4為本發(fā)明實施例中運用監(jiān)控代碼在運行中監(jiān)控JavaScript程序的流程圖示?!揪唧w實施方式】
[0017]為了使本發(fā)明的目的、技術方案及優(yōu)點更加清楚明白,以下結合附圖及實施例,對本發(fā)明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0018]請參照圖一所示,本發(fā)明實施例增強JavaScript函數(shù)封裝性的方法包括如下步驟:
51:附加訪問權限控制符到JavaScript函數(shù),定義JavaScript函數(shù)的封裝性,具體如
下:
主流靜態(tài)面向對象語言中的訪問權限控制符private、protected和public是JavaScript語言標準ECMAScript保留字,不允許在合法的JavaScript程序中出現(xiàn)。步驟SI中的訪問權限控制符設置為字符A、字符B和字符C,在本實施例中,所述訪問權限控制符A、B和C分別設置為:當前訪問權限修飾符“current”、友好訪問權限控制符“friend”和繼承訪問權限修飾符“inherit”。訪問權限控制符A、B、C還可以采用除保留字以外的其它任意字符。根據(jù)上述訪問權限控制符,將JavaScript函數(shù)的封裝性定義如下:
使用current修飾目標函數(shù),允許當前函數(shù)所在范圍的語句調(diào)用目標函數(shù),禁止其它訪問控制范圍內(nèi)的語句調(diào)用目標函數(shù);使用friend修飾目標函數(shù),允許當前函數(shù)所在范圍的語句調(diào)用目標函數(shù),允許友員函數(shù)內(nèi)部范圍內(nèi)的語句調(diào)用目標函數(shù),禁止其他訪問控制范圍內(nèi)的語句調(diào)用目標函數(shù);使用inherit修飾目標函數(shù),允許目標函數(shù)所在范圍的語句調(diào)用目標函數(shù),允許從目標函數(shù)的外部范圍的函數(shù)原型繼承的函數(shù)調(diào)用目標函數(shù),禁止其它訪問控制范圍內(nèi)的語句調(diào)用目標函數(shù),具體如下表所述:
【權利要求】
1.一種增強JavaScript函數(shù)封裝性的方法,其特性在于,包括如下步驟: 51:附加訪問權限控制符到JavaScript函數(shù),定義JavaScript函數(shù)的封裝性; 52:根據(jù)步驟SI提出的JavaScript函數(shù)訪問權限控制符和JavaScript函數(shù)封裝性定義,設計JavaScript程序預處理系統(tǒng)生成JavaScript函數(shù)的監(jiān)控代碼; 53:運用JavaScript函數(shù)監(jiān)控代碼,在運行時監(jiān)控JavaScript程序的運行過程,阻止違反JavaScript函數(shù)封裝性定義的函數(shù)調(diào)用。
2.根據(jù)權利要求1所述的增強JavaScript函數(shù)封裝性的方法,其特性在于:所述步驟SI中的訪問權限控制符設置為字符A、字符B和字符C,所述JavaScript函數(shù)的封裝性定義如下: 使用字符A修飾目標函數(shù),允許當前函數(shù)所在范圍的語句調(diào)用目標函數(shù),禁止其它訪問控制范圍內(nèi)的語句調(diào)用目標函數(shù); 使用字符B修飾目標函數(shù),允許當前函數(shù)所在范圍的語句調(diào)用目標函數(shù),允許友員函數(shù)內(nèi)部范圍內(nèi)的語句調(diào)用目標函數(shù),禁止其他訪問控制范圍內(nèi)的語句調(diào)用目標函數(shù); 使用字符C修飾目標函數(shù),允許目標函數(shù)所在范圍的語句調(diào)用目標函數(shù),允許從目標函數(shù)的外部范圍的函數(shù)原型繼承的函數(shù)調(diào)用目標函數(shù),禁止其它訪問控制范圍內(nèi)的語句調(diào)用目標函數(shù)。
3.根據(jù)權利要求2所述的增強JavaScript函數(shù)封裝性的方法,其特性在于:所述步驟S2中,預處理系統(tǒng)根據(jù)目標函數(shù)的封裝性定義掃描目標函數(shù)的程序上下文,生成目標函數(shù)的監(jiān)控代碼。
4.根據(jù)權利要求3所 述的增強JavaScript函數(shù)封裝性的方法,其特性在于,所述步驟S2具體包括: 521:掃描附加訪問權限控制符的目標函數(shù),生成目標函數(shù)的包裝函數(shù); 522:用步驟S21中生成的包裝函數(shù)代碼替換源程序中的目標函數(shù)代碼; 523:在步驟S22中生成的程序前面附加對JavaScript面向方面擴展庫的調(diào)用; 524:根據(jù)目標函數(shù)的訪問權限控制符,在步驟S23生成的程序后面附加相應的授權代碼,授權代碼利用JavaScript面向方面擴展庫監(jiān)控訪問控制范圍內(nèi)的目標函數(shù)的調(diào)用,對正確的目標函數(shù)調(diào)用進行授權; 525:在步驟S24生成的程序后面附加檢查函數(shù)的定義,檢查函數(shù)的參數(shù)是目標函數(shù)名稱,測試對目標函數(shù)的調(diào)用是否正確; 526:將步驟S25生成的程序替換包含目標函數(shù)的源程序。
5.根據(jù)權利要求4所述的增強JavaScript函數(shù)封裝性的方法,其特性在于:所述步驟S3具體包括如下: 531:當目標函數(shù)被執(zhí)行,繼續(xù)執(zhí)行步驟S32 ; 532:如果針對目標函數(shù)的調(diào)用在所述JavaScript函數(shù)的封裝性定義范圍內(nèi),繼續(xù)執(zhí)行步驟S33 ;如果針對目標函數(shù)的調(diào)用不在JavaScript函數(shù)的封裝性定義范圍內(nèi),執(zhí)行步驟 S34 ; 533:授權代碼對正確的目標函數(shù)調(diào)用進行授權,繼續(xù)執(zhí)行步驟S34 ; 534:調(diào)用包裝函數(shù),繼續(xù)執(zhí)行步驟S35 ; 535:調(diào)用檢查函數(shù),檢查針對目標函數(shù)的調(diào)用是否合法,如果針對目標函數(shù)的調(diào)用已被授權,執(zhí)行步驟36 ;如果針對目標函數(shù)的調(diào)用沒有被授權,則拋出運行時異常; S36:執(zhí)行目標函數(shù),完成后繼續(xù)執(zhí)行程序。
6.根據(jù)權利要求2-5中任一所述的增強JavaScript函數(shù)封裝性的方法,其特性在于,所述字符A、字符B和字符C分別設 置為current、friend和inherit。
【文檔編號】G06F21/12GK103440440SQ201310378376
【公開日】2013年12月11日 申請日期:2013年8月27日 優(yōu)先權日:2013年8月27日
【發(fā)明者】吳明暉, 呂嘉 申請人:浙江大學城市學院