本發(fā)明涉及計算機軟件領(lǐng)域,具體而言,涉及一種評估代碼文件安全性的方法及裝置。
背景技術(shù):
:“web”的含義是服務(wù)器開放web服務(wù),“shell”的含義是取得對服務(wù)器某種程度上操作權(quán)限。webshell通常是以asp、php、jsp或者cgl等網(wǎng)頁文件形式存在的一種命令執(zhí)行環(huán)境,也可以將其稱為一種網(wǎng)頁后門。黑客入侵者在入侵一個網(wǎng)站后,通常會將asp或php后門文件與網(wǎng)站服務(wù)器web目錄下的正常網(wǎng)頁文件混在一起,然后便可以使用瀏覽器來訪問asp或者php后門,以達(dá)到控制網(wǎng)站服務(wù)器的目的。由于webshell其大多是以動態(tài)腳本的形式出現(xiàn),其本質(zhì)上也是網(wǎng)站的一個頁面,但是由于它的功能遠(yuǎn)遠(yuǎn)超出了一個頁面允許操作的范圍,包括在系統(tǒng)層執(zhí)行一個或多個操作,而這些操作權(quán)限往往只有網(wǎng)站管理員才能具備,因此,通常又被稱之為網(wǎng)站的后門工具。詞法分析是計算機科學(xué)中將字符序列轉(zhuǎn)換為單詞(token,其為編程語言中的最小元素)序列的過程。詞法分析階段是編譯過程的第一個階段,其為編譯的基礎(chǔ)。這個階段的任務(wù)是從左到右逐個字符地讀入源程序,即,對構(gòu)成源程序的字符流進(jìn)行掃描,然后根據(jù)構(gòu)詞規(guī)則識別單詞(又稱單詞符號或符號)。詞法解析的核心任務(wù)便是掃描、識別單詞且對識別出的單詞給出定性、定長的處理。php支持變量函數(shù)的概念。這意味著如果一個變量名后有圓括號,php將尋找與變量的值同名的函數(shù),并且將嘗試執(zhí)行它。變量函數(shù)不能用于語言結(jié)構(gòu),例如:echo(),print(),unset(),isset(),empty(),include(),require()以及類似的語句,其需要使用自身的外殼函數(shù)來將這些結(jié)構(gòu)用作變量函數(shù)。近些年來,隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,伴隨而來的便是黑客針對網(wǎng)站的攻擊不斷增加。國家互聯(lián)網(wǎng)應(yīng)急響應(yīng)中心出具的《2014年中國互聯(lián)網(wǎng)網(wǎng)絡(luò)安全報告》表明,2014年全年在我國境內(nèi)有40186個網(wǎng)站被植入后門,其中,包括政府網(wǎng)站1529個。黑客往往在利用web漏洞攻擊成功后上傳webshell到網(wǎng)站的隱蔽目錄,從而獲得對網(wǎng) 站的持續(xù)控制權(quán),并且大部分webshell的連接都與正常的網(wǎng)站訪問類似,通過瀏覽器及超文本傳輸協(xié)議(http)的80端口進(jìn)行傳輸數(shù)據(jù),隱蔽性高,傳統(tǒng)的防火墻無記錄。而根據(jù)w3techs網(wǎng)站的統(tǒng)計,截止到2016年1月24日,全球網(wǎng)站的編程語言中php占到了81.7%,基于此,其對應(yīng)的便是針對php語言編寫的網(wǎng)站的webshell所占據(jù)的比重也明顯增大。由于webshell需要由對應(yīng)腳本語言進(jìn)行解釋執(zhí)行,在執(zhí)行之前會進(jìn)行詞法解析,將代碼解析成一個個單詞(標(biāo)記),同時賦予這個單詞特定的作用,這是編程語言最基本的組成單元,也就是token。目前,相關(guān)技術(shù)中提供了一種針對phpwebshall的基于虛擬機來實現(xiàn)的動態(tài)檢測技術(shù),其具體實施過程是首先將代碼文件進(jìn)行詞法、語法解析,待解析完成之后產(chǎn)生中間層代碼,隨后在虛擬機上解釋執(zhí)行前一步獲得的中間代碼,并在執(zhí)行過程中利用內(nèi)置函數(shù)庫和異常行為規(guī)則庫對中間行為進(jìn)行分析,以此來判斷其是否為惡意的webshell代碼。然而,由于這種動態(tài)webshell檢測技術(shù)需要利用虛擬機動態(tài)模擬執(zhí)行,在檢測的過程中消耗的時間較長,其不但無法做到真正的理解語義,而且也不能做到實時性檢測;不僅如此,現(xiàn)在大部分的webshell都會加入密碼及運行參數(shù),如果沒有指定參數(shù)或密碼,虛擬機動態(tài)檢測的技術(shù)根本無法判斷代碼是否為惡意,這也是目前虛擬機檢測技術(shù)難以逾越的鴻溝。此外,現(xiàn)有的靜態(tài)webshell檢測技術(shù)通常需要使用特征碼匹配的方式來判斷腳本文件是否為惡意的webshell。此種方法需要將網(wǎng)站中的腳本與特征庫中的特征進(jìn)行嚴(yán)格的字符串匹配,若在腳本中發(fā)現(xiàn)特征字符串,則判定其為惡意的webshell;類似的,還可以使用正則表達(dá)式來描述特征碼的,但本質(zhì)是也是依賴于特征碼,故而目前的靜態(tài)webshell檢測技術(shù)同樣存在以下缺陷:對是否為惡意的webshell的判定準(zhǔn)確率較低、誤殺率較高,而且特征庫龐大且隨時需要工作人員不斷收集樣本提取特征碼,尤其是針對變形的php變量函數(shù),僅依賴特征庫來完成判定基本上是無法完成惡意webshell檢測的。針對上述的問題,目前尚未提出有效的解決方案。技術(shù)實現(xiàn)要素:本發(fā)明實施例提供了一種評估代碼文件安全性的方法及裝置,以至少解決相關(guān)技術(shù)中所提供的針對webshell代碼文件的安全性檢測方案檢測效率較低,準(zhǔn)確性不高的技術(shù)問題。根據(jù)本發(fā)明實施例的一個方面,提供了一種評估代碼文件安全性的方法,包括:從待檢測的代碼文件中解析出變量函數(shù)以及賦值表達(dá)式;根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù);通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)和預(yù)設(shè)的與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估??蛇x地,從代碼文件中解析出變量函數(shù)以及賦值表達(dá)式包括:對代碼文件進(jìn)行詞法分析,將代碼文件中的字符序列轉(zhuǎn)換為token序列;從token序列中解析出變量函數(shù)以及賦值表達(dá)式??蛇x地,從token序列中解析出變量函數(shù)包括:查找步驟:按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為左圓括號的第一token;判斷步驟:在查找到第一token的情況下,判斷與第一token相鄰的前一個遍歷的token的類別是否為變量;如果是,則從第一token開始查找類別為操作符,取值為右圓括號的第二token,并將第一token與第二token之間的參數(shù)集合與預(yù)設(shè)的正則表達(dá)式相匹配的情況下,將當(dāng)前查找到的函數(shù)記錄為變量函數(shù),返回查找步驟,直至解析出變量函數(shù)??蛇x地,從token序列中解析出賦值表達(dá)式包括:查找步驟:按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為等號的第三token;獲取步驟:在查找到第三token的情況下,獲取與第三token相鄰的前一個遍歷的token,并將獲取到的token的取值記錄為當(dāng)前查找到的賦值表達(dá)式中待賦值的變量;從第三token開始查找類別為操作符,取值為分號的第四token,獲取第三token與第四token之間的一個或多個token,并將一個或多個token記錄為當(dāng)前查找到的賦值表達(dá)式中待計算的表達(dá)式,返回查找步驟,直至解析出賦值表達(dá)式??蛇x地,根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù)包括:從預(yù)設(shè)轉(zhuǎn)碼規(guī)則中查找與變量函數(shù)相匹配的直接調(diào)用函數(shù);計算出賦值表達(dá)式中與每個賦值表達(dá)式的變量對應(yīng)的取值,并在每個賦值表達(dá)式的變量與對應(yīng)的取值之間建立對應(yīng)關(guān)系;采用預(yù)設(shè)轉(zhuǎn)碼規(guī)則和對應(yīng)關(guān)系從直接調(diào)用函數(shù)中識別出原始調(diào)用函數(shù)??蛇x地,通過與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估包括:從預(yù)設(shè)存儲區(qū)域讀取與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù);對與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)進(jìn)行求和運算,得到安全性評估結(jié)果。根據(jù)本發(fā)明實施例的另一方面,還提供了另一種評估代碼文件安全性的方法,包括:從待檢測的代碼文件中解析出變量函數(shù);根據(jù)變量函數(shù)還原出直接調(diào)用函數(shù);通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。根據(jù)本發(fā)明實施例的又一方面,提供了一種評估代碼文件安全性的裝置,包括:解析模塊,用于從待檢測的代碼文件中解析出變量函數(shù)以及賦值表達(dá)式;還原模塊,用于根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù);評估模塊,用于通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)和預(yù)設(shè)的與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。可選地,解析模塊包括:轉(zhuǎn)換單元,用于對代碼文件進(jìn)行詞法分析,將代碼文件中的字符序列轉(zhuǎn)換為token序列;解析單元,用于從token序列中解析出變量函數(shù)以及賦值表達(dá)式??蛇x地,解析單元包括:第一查找子單元,用于按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為左圓括號的第一token;判斷子單元,用于在查找到第一token的情況下,判斷與第一token相鄰的前一個遍歷的token的類別是否為變量;第一解析子單元,用于在判斷子單元輸出為是時,從第一token開始查找類別為操作符,取值為右圓括號的第二token,并將第一token與第二token之間的參數(shù)集合與預(yù)設(shè)的正則表達(dá)式相匹配的情況下,將當(dāng)前查找到的函數(shù)記錄為變量函數(shù),返回第一查找子單元,直至解析出變量函數(shù)??蛇x地,解析單元包括:第二查找子單元,用于按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為等號的第三token;獲取子單元,用于在查找到第三token的情況下,獲取與第三token相鄰的前一個遍歷的token,并將獲取到的token的取值記錄為當(dāng)前查找到的賦值表達(dá)式中待賦值的變量;第二解析子單元,用于從第三token開始查找類別為操作符,取值為分號的第四token,獲取第三token與第四token之間的一個或多個token,并將一個或多個token記錄為當(dāng)前查找到的賦值表達(dá)式中待計算的表達(dá)式,返回第二查找子單元,直至解析出賦值表達(dá)式??蛇x地,還原模塊包括:第一還原單元,用于從預(yù)設(shè)轉(zhuǎn)碼規(guī)則中查找與變量函數(shù)相匹配的直接調(diào)用函數(shù);處理單元,用于計算出賦值表達(dá)式中與每個賦值表達(dá)式的變量對應(yīng)的取值,并在每個賦值表達(dá)式的變量與對應(yīng)的取值之間建立對應(yīng)關(guān)系;第二還原單元,用于采用預(yù)設(shè)轉(zhuǎn)碼規(guī)則和對應(yīng)關(guān)系從直接調(diào)用函數(shù)中識別出原始調(diào)用函數(shù)。可選地,評估模塊包括:讀取單元,用于從預(yù)設(shè)存儲區(qū)域讀取與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù);計算單元,用于對與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)進(jìn)行求和運算,得到安全性評 估結(jié)果。根據(jù)本發(fā)明實施例的再一方面,還提供了另一種評估代碼文件安全性的裝置,包括:解析模塊,用于從待檢測的代碼文件中解析出變量函數(shù);還原模塊,用于根據(jù)變量函數(shù)還原出直接調(diào)用函數(shù);評估模塊,用于通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。在本發(fā)明實施例中,采用從待檢測的代碼文件中解析出變量函數(shù)以及賦值表達(dá)式的方式,根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù)并通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)和預(yù)設(shè)的與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估,從而實現(xiàn)了提高變量函數(shù)型webshell代碼文件的檢測效率,提升檢測結(jié)果準(zhǔn)確性的技術(shù)效果,進(jìn)而解決了相關(guān)技術(shù)中所提供的針對webshell代碼文件的安全性檢測方案檢測效率較低,準(zhǔn)確性不高的技術(shù)問題。附圖說明此處所說明的附圖用來提供對本發(fā)明的進(jìn)一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:圖1是本發(fā)明實施例的一種評估代碼文件安全性的方法的計算機終端的硬件結(jié)構(gòu)框圖;圖2是根據(jù)本發(fā)明實施例的評估代碼文件安全性的方法的流程圖;圖3是根據(jù)本發(fā)明實施例的另一種評估代碼文件安全性的方法的流程圖;圖4是根據(jù)本發(fā)明實施例的一種評估代碼文件安全性的裝置的結(jié)構(gòu)框圖;圖5是根據(jù)本發(fā)明優(yōu)選實施例的一種評估代碼文件安全性的裝置的結(jié)構(gòu)框圖;圖6是根據(jù)本發(fā)明實施例的另一種評估代碼文件安全性的裝置的結(jié)構(gòu)框圖;圖7是根據(jù)本發(fā)明實施例的一種計算機終端的結(jié)構(gòu)框圖。具體實施方式為了使本
技術(shù)領(lǐng)域:
的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的 附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分的實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應(yīng)當(dāng)屬于本發(fā)明保護(hù)的范圍。需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本發(fā)明的實施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤4送?,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。本發(fā)明所涉及到的名詞解釋如下:(1)變量函數(shù)通常是指php所支持的函數(shù)概念,如果一個變量名后有圓括號,那么php將尋找與變量的值同名的函數(shù),并且嘗試執(zhí)行尋找到的函數(shù);(2)賦值表達(dá)式是指通過等號將變量與表達(dá)式相連接,通過計算賦值運算符右側(cè)表達(dá)式的值,再將賦值運算符右側(cè)表達(dá)式的值賦給左側(cè)的變量,進(jìn)而將賦值表達(dá)式左側(cè)的變量的值作為表達(dá)式的值;(3)直接調(diào)用函數(shù)是指根據(jù)從代碼文件中解析出的變量函數(shù)按照預(yù)設(shè)轉(zhuǎn)碼規(guī)則通過直接調(diào)用的方式還原出的未經(jīng)轉(zhuǎn)碼的函數(shù);例如:“$_uu=chr(99).chr(104).chr(114)”按照ascii碼轉(zhuǎn)碼規(guī)則可以還原出直接調(diào)用函數(shù)為:chr;(4)原始調(diào)用函數(shù)是指根據(jù)從代碼文件中解析出的變量函數(shù)以及賦值表達(dá)式按照預(yù)設(shè)轉(zhuǎn)碼規(guī)則通過回溯(迭代)調(diào)用的方式還原出的未經(jīng)轉(zhuǎn)碼的函數(shù);例如:“$_uu=chr(99).chr(104).chr(114)”按照ascii碼轉(zhuǎn)碼規(guī)則可以還原出直接調(diào)用函數(shù)為:chr;“$_ff=$_uu(99).$_uu(114).$_uu(101).$_uu(97).$_uu(116).$_uu(101).$_uu(95).$_uu(102).$_uu(117).$_uu(110).$_uu(99).$_uu(116).$_uu(105).$_uu(111).$_uu(110)”按照ascii碼轉(zhuǎn)碼規(guī)則可以還原出直接調(diào)用函數(shù)為:create_function;“$_cc=$_uu(101).$_uu(118).$_uu(97).$_uu(108).$_uu(40).$_uu(36).$_uu(95).$_uu(80).$_uu(79).$_uu(83).$_uu(84).$_uu(91).$_uu(49).$_uu(93).$_uu(41) .$_uu(59)”按照ascii碼轉(zhuǎn)碼規(guī)則可以還原出直接調(diào)用函數(shù)為:eval($_post[1]);最終得到的與$_=$_ff("",$_cc)對應(yīng)的原始調(diào)用函數(shù)為:create_function("",eval($_post[1])。(5)轉(zhuǎn)碼規(guī)則是指預(yù)先制定的將代碼從一種格式轉(zhuǎn)換為另外一種格式的參照執(zhí)行標(biāo)準(zhǔn)。(6)安全系數(shù)是指根據(jù)長期統(tǒng)計分析得到的常用函數(shù)的安全級別或危險函數(shù)的危險級別;(7)評估是指判斷該代碼文件是否為入侵者(或攻擊者)惡意上傳的webshell文件。實施例1根據(jù)本發(fā)明實施例,還提供了一種評估代碼文件安全性的方法實施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執(zhí)行指令的計算機系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。本申請實施例一所提供的方法實施例可以在移動終端、計算機終端或者類似的運算裝置中執(zhí)行。以運行在計算機終端上為例,圖1是本發(fā)明實施例的一種評估代碼文件安全性的方法的計算機終端的硬件結(jié)構(gòu)框圖。如圖1所示,計算機終端10可以包括一個或多個(圖中僅示出一個)處理器102(處理器102可以包括但不限于微處理器mcu或可編程邏輯器件fpga等的處理裝置)、用于存儲數(shù)據(jù)的存儲器104、以及用于通信功能的傳輸裝置106。本領(lǐng)域普通技術(shù)人員可以理解,圖1所示的結(jié)構(gòu)僅為示意,其并不對上述電子裝置的結(jié)構(gòu)造成限定。例如,計算機終端10還可包括比圖1中所示更多或者更少的組件,或者具有與圖1所示不同的配置。存儲器104可用于存儲應(yīng)用軟件的軟件程序以及模塊,如本發(fā)明實施例中的評估代碼文件安全性的方法對應(yīng)的程序指令/模塊,處理器102通過運行存儲在存儲器104內(nèi)的軟件程序以及模塊,從而執(zhí)行各種功能應(yīng)用以及數(shù)據(jù)處理,即實現(xiàn)上述的評估代碼文件安全性的方法。存儲器104可包括高速隨機存儲器,還可包括非易失性存儲器,如一個或者多個磁性存儲裝置、閃存、或者其他非易失性固態(tài)存儲器。在一些實例中,存儲器104可進(jìn)一步包括相對于處理器102遠(yuǎn)程設(shè)置的存儲器,這些遠(yuǎn)程存儲器可以通過網(wǎng)絡(luò)連接至計算機終端10。上述網(wǎng)絡(luò)的實例包括但不限于互聯(lián)網(wǎng)、企業(yè)內(nèi)部網(wǎng)、 局域網(wǎng)、移動通信網(wǎng)及其組合。傳輸裝置106用于經(jīng)由一個網(wǎng)絡(luò)接收或者發(fā)送數(shù)據(jù)。上述的網(wǎng)絡(luò)具體實例可包括計算機終端10的通信供應(yīng)商提供的無線網(wǎng)絡(luò)。在一個實例中,傳輸裝置106包括一個網(wǎng)絡(luò)適配器(networkinterfacecontroller,簡稱為nic),其可通過基站與其他網(wǎng)絡(luò)設(shè)備相連從而可與互聯(lián)網(wǎng)進(jìn)行通訊。在一個實例中,傳輸裝置106可以為射頻(radiofrequency,簡稱為rf)模塊,其用于通過無線方式與互聯(lián)網(wǎng)進(jìn)行通訊。在上述運行環(huán)境下,本申請?zhí)峁┝巳鐖D2所示的評估代碼文件安全性的方法。圖2是根據(jù)本發(fā)明實施例的評估代碼文件安全性的方法的流程圖。如圖2所示,該方法可以包括以下處理步驟:步驟s22:從待檢測的代碼文件中解析出變量函數(shù)以及賦值表達(dá)式;步驟s24:根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù);步驟s26:通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)和預(yù)設(shè)的與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。本發(fā)明實施例所提供的技術(shù)方案可以應(yīng)用于php腳本語言的webshell靜態(tài)檢測。通過對采用php代碼編寫的代碼文件進(jìn)行解析(包括:詞法分析、語義分析),對于由字符序列拼接而成的變量函數(shù)進(jìn)行還原,同時根據(jù)還原出來的直接調(diào)用函數(shù)以及代碼文件中的賦值表達(dá)式向前進(jìn)行代碼回溯,直至還原出原始調(diào)用函數(shù),以判斷該代碼文件中是否包含webshell常用函數(shù)或危險函數(shù)。隨后,再通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)(例如:常用函數(shù)或危險函數(shù)的危險級別)和預(yù)設(shè)的與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估,判斷該代碼文件是否為入侵者(或攻擊者)惡意上傳的webshell文件。需要說明的是,上述對代碼文件的安全性進(jìn)行評估的過程可以使用lua作為實現(xiàn)語言。由于lua語言的模擬器體積小、運行速度快、占用內(nèi)存低、兼容性好、開發(fā)速度快等優(yōu)點,同時其與c/c++語言的相互調(diào)用也非常方便,因此,非常容易集成本發(fā)明實施例所提供的技術(shù)方案。可選地,在步驟s22中,從代碼文件中解析出變量函數(shù)以及賦值表達(dá)式可以包括以下執(zhí)行步驟:步驟s221:對代碼文件進(jìn)行詞法分析,將代碼文件中的字符序列轉(zhuǎn)換為token序列;步驟s222:從token序列中解析出變量函數(shù)以及賦值表達(dá)式。通過詞法分析器可以借鑒lua的lexer詞法解析庫以及php的zend模塊詞法分析從代碼文件中的源程序分別提取出標(biāo)識符、注釋、數(shù)字、php關(guān)鍵字、變量、運算符以及特殊字符進(jìn)行正則匹配,進(jìn)而從原始的代碼文件中將所有token按照先后順序提取出來組成tokens數(shù)組,詞法分析器所輸出單詞符號通??梢员硎緸槿缦碌亩剑?單詞類型,單詞屬性值);其中,由于關(guān)鍵字是由程序語言定義的具有固定意義的標(biāo)識符,故而關(guān)鍵字通常不被用作一般標(biāo)識符;標(biāo)識符可以用來表示各種名稱,例如:變量名稱、數(shù)組名稱、函數(shù)名稱、過程名稱;常數(shù)的類型可以包括但不限于:整型、實型、布爾型、文字型;運算符的類型可以包括但不限于:+、-、*、/。假設(shè)待檢測的代碼文件中截取的代碼段如下:<?$_uu=chr(99).chr(104).chr(114);$_cc=$_uu(101).$_uu(118).$_uu(97).$_uu(108).$_uu(40).$_uu(36).$_uu(95).$_uu(80).$_uu(79).$_uu(83).$_uu(84).$_uu(91).$_uu(49).$_uu(93).$_uu(41).$_uu(59);$_ff=$_uu(99).$_uu(114).$_uu(101).$_uu(97).$_uu(116).$_uu(101).$_uu(95).$_uu(102).$_uu(117).$_uu(110).$_uu(99).$_uu(116).$_uu(105).$_uu(111).$_uu(110);$_=$_ff("",$_cc);@$_();?>以代碼行“$_uu=chr(99).chr(104).chr(114);”為例進(jìn)行詞法分析得到的結(jié)果如表1所示:表1類別屬性值變量$_uu運算符=標(biāo)識符chr運算符(數(shù)字99運算符)運算符.標(biāo)識符chr運算符(數(shù)字104運算符)運算符.標(biāo)識符chr運算符(數(shù)字114運算符)運算符;上述代碼段均可以按照如表1所示的轉(zhuǎn)化形式將字符序列轉(zhuǎn)化為token序列,從token序列中解析出變量函數(shù)以及賦值表達(dá)式??蛇x地,在步驟s222中,從token序列中解析出變量函數(shù)可以包括以下執(zhí)行步驟:步驟s2221:按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為左圓括號的第一token;步驟s2222:在查找到第一token的情況下,判斷與第一token相鄰的前一個遍歷的token的類別是否為變量;步驟s2223:如果是,則從第一token開始查找類別為操作符,取值為右圓括號的第二token,并將第一token與第二token之間的參數(shù)集合與預(yù)設(shè)的正則表達(dá)式相匹配的情況下,將當(dāng)前查找到的函數(shù)記錄為變量函數(shù),返回步驟s2221,直至解析出變量函數(shù)。在通過詞法分析得到上述tokens數(shù)組后,可以按照預(yù)設(shè)順序(例如:按照詞法分析器對代碼文件進(jìn)行分析的順序)依次遍歷tokens數(shù)組中的每一個token。由于函數(shù)調(diào)用需要使用到圓括號(即“()”),因此,首先需要查找類別為操作符,取值為左圓括號(即“(”)的tokens[i](相當(dāng)于上述第一token);其次,在查找到類別為操作符,取值為左圓括號(即“(”)的tokens[i]之后,再進(jìn)一步獲取前一個遍歷的token[i-1]的類別是否為變量;然后,如果token[i-1]的類別為變量,則繼續(xù)查找類別為操作 符,取值為右圓括號的tokens[i+n](相當(dāng)于上述第二token,n為正整數(shù)),并將第一token與第二token之間的參數(shù)集合與預(yù)設(shè)的正則表達(dá)式相匹配的情況下,將當(dāng)前查找到的函數(shù)記錄為變量函數(shù),其中,上述參數(shù)集合只要能夠符合php正則表達(dá)式的匹配規(guī)則即可。例如:參數(shù)集合可以包括但不限于以下至少之一:字母、數(shù)字、下劃線、特殊符號(例如:$)、用戶訪問php網(wǎng)頁傳輸?shù)膮?shù)。需要說明的是,如果同時存在$以及字母、數(shù)字、下劃線三者至少之一時,則需要以$開頭,例如:$_post[‘a(chǎn)aa’],如果不采用$作為開頭,那么得到的參數(shù)集合將不符合上述php正則表達(dá)式的匹配規(guī)則,例如:a$b。具體到上述代碼段示例,當(dāng)檢測到第一個“(”時,由于該“(”的前一個token為chr,其類別為標(biāo)識符而并非是變量,因此,chr(99)不是變量函數(shù)。當(dāng)檢測到第二個“(”時,由于該“(”的前一個token為chr,其類別為標(biāo)識符而并非是變量,因此,chr(104)不是變量函數(shù)。當(dāng)檢測到第三個“(”時,由于該“(”的前一個token為chr,其類別為標(biāo)識符而并非是變量,因此,chr(114)不是變量函數(shù)。直到當(dāng)檢測到第四個“(”時,由于該“(”的前一個token為$_uu,其類別為變量,因此,需要繼續(xù)判斷在該“(”與其后的第一個“)”之間的101是否符合上述php正則表達(dá)式的匹配規(guī)則,經(jīng)過匹配數(shù)字101是符合上述php正則表達(dá)式的匹配規(guī)則的,因此,$_uu(101)即為需要查找的變量函數(shù),其中,$_uu為變量函數(shù)名稱,101為變量函數(shù)內(nèi)的參數(shù)。同理,以此類推,上述代碼段中的變量函數(shù)還可以包括:$_uu(118),$_uu(97),$_uu(108),$_uu(40),$_uu(36),_uu(95).$_uu(80),$_uu(79).$_uu(83),$_uu(84),$_uu(91),$_uu(49),$_uu(93),$_uu(41),$_uu(59),$_uu(99),$_uu(114),$_uu(101),$_uu(97),$_uu(116),$_uu(101),$_uu(95),$_uu(102),$_uu(117),$_uu(110),$_uu(99),$_uu(116),$_uu(105),$_uu(111),$_uu(110),$_ff("",$_cc)。可選地,在步驟s222中,從token序列中解析出賦值表達(dá)式可以包括以下執(zhí)行步驟:步驟s2224:按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為等號的第三token;步驟s2225:在查找到第三token的情況下,獲取與第三token相鄰的前一個遍歷的token,并將獲取到的token的取值記錄為當(dāng)前查找到的賦值表達(dá)式中待賦值的變量;步驟s2226:從第三token開始查找類別為操作符,取值為分號的第四token,獲取第三token與第四token之間的一個或多個token,并將一個或多個token記錄為 當(dāng)前查找到的賦值表達(dá)式中待計算的表達(dá)式,返回步驟s2224,直至解析出賦值表達(dá)式。在通過詞法分析得到上述tokens數(shù)組后,與獲取變量函數(shù)不同之處在于:賦值表達(dá)式主要通過等號(=)來實現(xiàn)。因此,可以按照預(yù)設(shè)順序(例如:按照詞法分析器對代碼文件進(jìn)行分析的順序)依次遍歷tokens數(shù)組中的每一個token。由于賦值表達(dá)式需要使用到等號(即“=”),因此,首先需要查找類別為操作符,取值為等號(即“=”)的tokens[i](相當(dāng)于上述第三token);其次,再進(jìn)一步獲取前一個遍歷的token[i-1],并將獲取到的token的取值記錄為當(dāng)前查找到的賦值表達(dá)式中待賦值的變量;然后,繼續(xù)查找類別為操作符,取值為分號的tokens[i+n](相當(dāng)于上述第四token,n為正整數(shù)),并將tokens[i]與tokens[i+n]之間的一個或多個token記錄為當(dāng)前查找到的賦值表達(dá)式中待計算的表達(dá)式。具體到上述代碼段示例,當(dāng)檢測到第一個“=”時,進(jìn)一步獲取前一個遍歷的token[i-1],并將獲取到的token的取值(即$_uu)記錄為當(dāng)前查找到的賦值表達(dá)式中待賦值的變量;然后,繼續(xù)查找類別為操作符,取值為“;”的tokens[i+n],并將tokens[i]與tokens[i+n]之間的一個或多個token(即chr(99).chr(104).chr(114))記錄為當(dāng)前查找到的賦值表達(dá)式中待計算的表達(dá)式。同理,以此類推,可以發(fā)現(xiàn)在上述代碼段中存在如表2所示的賦值表達(dá)式:表2可選地,在步驟s24中,根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù)可以包括以下執(zhí)行步驟:步驟s241:從預(yù)設(shè)轉(zhuǎn)碼規(guī)則中查找與變量函數(shù)相匹配的直接調(diào)用函數(shù);步驟s242:計算出賦值表達(dá)式中與每個賦值表達(dá)式的變量對應(yīng)的取值,并在每個賦值表達(dá)式的變量與對應(yīng)的取值之間建立對應(yīng)關(guān)系;步驟s243:采用預(yù)設(shè)轉(zhuǎn)碼規(guī)則和對應(yīng)關(guān)系從直接調(diào)用函數(shù)中識別出原始調(diào)用函數(shù)。通過上述表2可知,在賦值表達(dá)式“$_uu=chr(99).chr(104).chr(114)”中的“=” 右邊的表達(dá)式是由ascii碼(相當(dāng)于上述預(yù)設(shè)轉(zhuǎn)碼規(guī)則)進(jìn)行轉(zhuǎn)碼得到的。ascii碼使用指定的7位或8位二進(jìn)制數(shù)組合來表示128或256種可能的字符。標(biāo)準(zhǔn)ascii碼也叫基礎(chǔ)ascii碼,使用7位二進(jìn)制數(shù)來表示所有的大寫和小寫字母,數(shù)字0到9、標(biāo)點符號,以及在美式英語中使用的特殊控制字符(這里需要特別注意:ascii碼與標(biāo)準(zhǔn)ascii碼的位數(shù)上的區(qū)分,標(biāo)準(zhǔn)ascii碼是7位二進(jìn)制表示)。通過十進(jìn)制編碼(對應(yīng))縮寫字符(或功能/解釋)可以看到,chr(99)對應(yīng)于小寫字母“c”,chr(104)對應(yīng)于小寫字母“h”,chr(114)對應(yīng)于小寫字母“r”,因此,在該賦值表達(dá)式中,與變量$_uu對應(yīng)的表達(dá)式的取值為chr。同理,在賦值表達(dá)式$_ff=$_uu(99).$_uu(114).$_uu(101).$_uu(97).$_uu(116).$_uu(101).$_uu(95).$_uu(102).$_uu(117).$_uu(110).$_uu(99).$_uu(116).$_uu(105).$_uu(111).$_uu(110)中,與變量$_ff對應(yīng)的表達(dá)式的取值為create_function。在賦值表達(dá)式$_cc=$_uu(101).$_uu(118).$_uu(97).$_uu(108).$_uu(40).$_uu(36).$_uu(95).$_uu(80).$_uu(79).$_uu(83).$_uu(84).$_uu(91).$_uu(49).$_uu(93).$_uu(41).$_uu(59)中,與變量$_cc對應(yīng)的表達(dá)式的取值為eval($_post[1])。最終,在賦值表達(dá)式$_=$_ff("",$_cc)中,與變量$_對應(yīng)的表達(dá)式的取值為create_function("",eval($_post[1])。通過上述分析,可以在每個賦值表達(dá)式的變量與對應(yīng)的取值之間建立對應(yīng)關(guān)系。其次,通過賦值表達(dá)式“$_uu=chr(99).chr(104).chr(114)”按照ascii碼轉(zhuǎn)碼規(guī)則可以還原出直接調(diào)用函數(shù)chr;然后,根據(jù)ascii碼轉(zhuǎn)碼規(guī)則以及已經(jīng)建立的變量與表達(dá)式取值之間的對應(yīng)關(guān)系$_→$_ff,$_cc→$_uu依次回溯,直至得到原始調(diào)用函數(shù)create_function("",eval($_post[1]),其中,eval($_post[1]表示創(chuàng)建這樣的一個函數(shù),用于執(zhí)行httppost的代碼,由此能夠明顯看出create_function("",eval($_post[1])具有惡意的webshell性質(zhì);可選地,在步驟s26中,通過與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估可以包括以下執(zhí)行步驟:步驟s262:從預(yù)設(shè)存儲區(qū)域讀取與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù);步驟s264:對與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)進(jìn)行求和運算,得到安全性評估結(jié)果。根據(jù)預(yù)先設(shè)定的與直接調(diào)用函數(shù)chr對應(yīng)的安全系數(shù)(例如:預(yù)設(shè)的危險評分或安全評分)以及根據(jù)預(yù)先設(shè)定的與原始調(diào)用函數(shù)create_function("",eval($_post[1])對應(yīng)的安全系數(shù)進(jìn)行綜合評估確定代碼文件的危險等級(例如: 普通危險級別,中等危險級別,高等危險級別),例如:直接調(diào)用函數(shù)chr對應(yīng)的危險評分為1分,而原始調(diào)用函數(shù)create_function("",eval($_post[1])對應(yīng)的危險評分為3分,最終得到的安全性評估結(jié)果即為:4分。經(jīng)過評估最終確定上述代碼段屬于高危的惡意webshell文件。此外,在圖1所示的運行環(huán)境下,本申請還提供了如圖3所示的另一種評估代碼文件安全性的方法。圖3是根據(jù)本發(fā)明實施例的另一種評估代碼文件安全性的方法的流程圖。如圖3所示,該方法可以包括以下處理步驟:步驟s32:從待檢測的代碼文件中解析出變量函數(shù);步驟s34:根據(jù)變量函數(shù)還原出直接調(diào)用函數(shù);步驟s36:通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。在待檢測的代碼文件中既可以包含賦值表達(dá)式,當(dāng)然也可以不包含賦值表達(dá)式。而對于不包含賦值表達(dá)式的php代碼文件,其評估方式相對簡單,主要依據(jù)預(yù)設(shè)轉(zhuǎn)碼規(guī)則(例如:ascii碼轉(zhuǎn)碼規(guī)則)從php代碼文件中還原出直接調(diào)用函數(shù)。然后,再利用預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估即可。在優(yōu)選實施過程中,可以通過詞法分析器可以借鑒lua的lexer詞法解析庫以及php的zend模塊詞法分析從代碼文件中的源程序分別提取出標(biāo)識符、注釋、數(shù)字、php關(guān)鍵字、變量、運算符以及特殊字符進(jìn)行正則匹配,進(jìn)而從原始的代碼文件中將所有token按照先后順序提取出來組成tokens數(shù)組。然后,再從tokens數(shù)組中解析出變量函數(shù)。在通過詞法分析得到上述tokens數(shù)組后,可以按照預(yù)設(shè)順序(例如:按照詞法分析器對代碼文件進(jìn)行分析的順序)依次遍歷tokens數(shù)組中的每一個token。由于函數(shù)調(diào)用需要使用到圓括號(即“()”),因此,首先需要查找類別為操作符,取值為左圓括號(即“(”)的tokens[i](相當(dāng)于上述第一token);其次,在查找到類別為操作符,取值為左圓括號(即“(”)的tokens[i]之后,再進(jìn)一步獲取前一個遍歷的token[i-1]的類別是否為變量;然后,如果token[i-1]的類別為變量,則繼續(xù)查找類別為操作符,取值為右圓括號的tokens[i+n](相當(dāng)于上述第二token,n為正整數(shù)),并將第一token與第二token之間的參數(shù)集合與預(yù)設(shè)的正則表達(dá)式相匹配的情況下,將當(dāng)前查找到的函數(shù)記錄為變量函數(shù),其中,上述參數(shù)集合只要能夠符合php正則表達(dá)式的匹配規(guī)則即可。例如:參數(shù)集合可以包括但不限于以下至少之一:字母、數(shù)字、下劃 線、特殊符號(例如:$)、用戶訪問php網(wǎng)頁傳輸?shù)膮?shù)。需要說明的是,如果同時存在$以及字母、數(shù)字、下劃線三者至少之一時,則需要以$開頭,例如:$_post[‘a(chǎn)aa’],如果不采用$作為開頭,那么得到的參數(shù)集合將不符合上述php正則表達(dá)式的匹配規(guī)則,例如:a$b。需要說明的是,對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據(jù)本發(fā)明,某些步驟可以采用其他順序或者同時進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作和模塊并不一定是本發(fā)明所必須的。通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到根據(jù)上述實施例的評估代碼文件安全性的方法可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當(dāng)然也可以通過硬件,但很多情況下前者是更佳的實施方式?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)(如rom/ram、磁碟、光盤)中,包括若干指令用以使得一臺終端設(shè)備(可以是手機,計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述的方法。實施例2根據(jù)本發(fā)明實施例,還提供了一種用于實施上述評估代碼文件安全性的方法的裝置實施例。圖4是根據(jù)本發(fā)明實施例的一種評估代碼文件安全性的裝置的結(jié)構(gòu)框圖。如圖4所示,該裝置包括:解析模塊10,用于從待檢測的代碼文件中解析出變量函數(shù)以及賦值表達(dá)式;還原模塊20,用于根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù);評估模塊30,用于通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)和預(yù)設(shè)的與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。本發(fā)明實施例所提供的技術(shù)方案可以應(yīng)用于php腳本語言的webshell靜態(tài)檢測。通過對采用php代碼編寫的代碼文件進(jìn)行解析(包括:詞法分析、語義分析),對于由字符序列拼接而成的變量函數(shù)進(jìn)行還原,同時根據(jù)還原出來的直接調(diào)用函數(shù)以及代碼文件中的賦值表達(dá)式向前進(jìn)行代碼回溯,直至還原出原始調(diào)用函數(shù),以判斷該代碼文件中是否包含webshell常用函數(shù)或危險函數(shù)。隨后,再通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)(例如:常用函數(shù)或危險函數(shù)的危險級別)和預(yù)設(shè)的與原始調(diào)用函數(shù)對 應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估,判斷該代碼文件是否為入侵者(或攻擊者)惡意上傳的webshell文件??蛇x地,圖5是根據(jù)本發(fā)明優(yōu)選實施例的一種評估代碼文件安全性的裝置的結(jié)構(gòu)框圖。如圖5所示,解析模塊10可以包括:轉(zhuǎn)換單元100,用于對代碼文件進(jìn)行詞法分析,將代碼文件中的字符序列轉(zhuǎn)換為token序列;解析單元102,用于從token序列中解析出變量函數(shù)以及賦值表達(dá)式??蛇x地,解析單元102可以包括:第一查找子單元(圖中未示出),用于按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為左圓括號的第一token;判斷子單元(圖中未示出),用于在查找到第一token的情況下,判斷與第一token相鄰的前一個遍歷的token的類別是否為變量;第一解析子單元(圖中未示出),用于在判斷子單元輸出為是時,從第一token開始查找類別為操作符,取值為右圓括號的第二token,并將第一token與第二token之間的參數(shù)集合與預(yù)設(shè)的正則表達(dá)式相匹配的情況下,將當(dāng)前查找到的函數(shù)記錄為變量函數(shù),返回第一查找子單元,直至解析出變量函數(shù)。在通過詞法分析得到上述tokens數(shù)組后,可以按照預(yù)設(shè)順序(例如:按照詞法分析器對代碼文件進(jìn)行分析的順序)依次遍歷tokens數(shù)組中的每一個token。由于函數(shù)調(diào)用需要使用到圓括號(即“()”),因此,首先需要查找類別為操作符,取值為左圓括號(即“(”)的tokens[i](相當(dāng)于上述第一token);其次,在查找到類別為操作符,取值為左圓括號(即“(”)的tokens[i]之后,再進(jìn)一步獲取前一個遍歷的token[i-1]的類別是否為變量;然后,如果token[i-1]的類別為變量,則繼續(xù)查找類別為操作符,取值為右圓括號的tokens[i+n](相當(dāng)于上述第二token,n為正整數(shù)),并將第一token與第二token之間的參數(shù)集合與預(yù)設(shè)的正則表達(dá)式相匹配的情況下,將當(dāng)前查找到的函數(shù)記錄為變量函數(shù),其中,上述參數(shù)集合只要能夠符合php正則表達(dá)式的匹配規(guī)則即可。例如:參數(shù)集合可以包括但不限于以下至少之一:字母、數(shù)字、下劃線、特殊符號(例如:$)、用戶訪問php網(wǎng)頁傳輸?shù)膮?shù)。需要說明的是,如果同時存在$以及字母、數(shù)字、下劃線三者至少之一時,則需要以$開頭,例如:$_post[‘a(chǎn)aa’],如果不采用$作為開頭,那么得到的參數(shù)集合將不符合上述php正則表達(dá)式的匹配規(guī)則,例如:a$b??蛇x地,解析單元102可以包括:第二查找子單元(圖中未示出),用于按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為等號的第三token;獲取子單元(圖中未示出),用于在查找到第三token的情況下,獲取與第三token相鄰的前一個遍歷的token,并將獲取到的token的取值記錄為當(dāng)前查找到的賦值表 達(dá)式中待賦值的變量;第二解析子單元(圖中未示出),用于從第三token開始查找類別為操作符,取值為分號的第四token,獲取第三token與第四token之間的一個或多個token,并將一個或多個token記錄為當(dāng)前查找到的賦值表達(dá)式中待計算的表達(dá)式,返回第二查找子單元,直至解析出賦值表達(dá)式。在通過詞法分析得到上述tokens數(shù)組后,與獲取變量函數(shù)不同之處在于:賦值表達(dá)式主要通過等號(=)來實現(xiàn)。因此,可以按照預(yù)設(shè)順序(例如:按照詞法分析器對代碼文件進(jìn)行分析的順序)依次遍歷tokens數(shù)組中的每一個token。由于賦值表達(dá)式需要使用到等號(即“=”),因此,首先需要查找類別為操作符,取值為等號(即“=”)的tokens[i](相當(dāng)于上述第三token);其次,再進(jìn)一步獲取前一個遍歷的token[i-1],并將獲取到的token的取值記錄為當(dāng)前查找到的賦值表達(dá)式中待賦值的變量;然后,繼續(xù)查找類別為操作符,取值為分號的tokens[i+n](相當(dāng)于上述第四token,n為正整數(shù)),并將tokens[i]與tokens[i+n]之間的一個或多個token記錄為當(dāng)前查找到的賦值表達(dá)式中待計算的表達(dá)式??蛇x地,如圖5所示,還原模塊20可以包括:第一還原單元200,用于從預(yù)設(shè)轉(zhuǎn)碼規(guī)則中查找與變量函數(shù)相匹配的直接調(diào)用函數(shù);處理單元202,用于計算出賦值表達(dá)式中與每個賦值表達(dá)式的變量對應(yīng)的取值,并在每個賦值表達(dá)式的變量與對應(yīng)的取值之間建立對應(yīng)關(guān)系;第二還原單元204,用于采用預(yù)設(shè)轉(zhuǎn)碼規(guī)則和對應(yīng)關(guān)系從直接調(diào)用函數(shù)中識別出原始調(diào)用函數(shù)??蛇x地,如圖5所示,評估模塊30可以包括:讀取單元300,用于從預(yù)設(shè)存儲區(qū)域讀取與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù);計算單元302,用于對與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)進(jìn)行求和運算,得到安全性評估結(jié)果。根據(jù)本發(fā)明實施例,還提供了另一種用于實施上述評估代碼文件安全性的方法的裝置實施例。圖6是根據(jù)本發(fā)明實施例的另一種評估代碼文件安全性的裝置的結(jié)構(gòu)框圖。如圖6所示,該裝置包括:解析模塊40,用于從待檢測的代碼文件中解析出變量函數(shù);還原模塊50,用于根據(jù)變量函數(shù)還原出直接調(diào)用函數(shù);評估模塊60,用于通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。在待檢測的代碼文件中既可以包含賦值表達(dá)式,當(dāng)然也可以不包含賦值表達(dá)式。而對于不包含賦值表達(dá)式的php代碼文件,其評估方式相對簡單,主要依據(jù)預(yù)設(shè)轉(zhuǎn)碼規(guī)則(例如:ascii碼轉(zhuǎn)碼規(guī)則)從php代碼文件中還原出直接調(diào)用函數(shù)。然后,再 利用預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估即可。實施例3本發(fā)明的實施例可以提供一種計算機終端,該計算機終端可以是計算機終端群中的任意一個計算機終端設(shè)備。可選地,在本實施例中,上述計算機終端也可以替換為移動終端等終端設(shè)備??蛇x地,在本實施例中,上述計算機終端可以位于計算機網(wǎng)絡(luò)的多個網(wǎng)絡(luò)設(shè)備中的至少一個網(wǎng)絡(luò)設(shè)備??蛇x地,圖7是根據(jù)本發(fā)明實施例的一種計算機終端的結(jié)構(gòu)框圖。如圖7所示,該計算機終端可以包括:一個或多個(圖中僅示出一個)處理器以及存儲器。其中,存儲器可用于存儲軟件程序以及模塊,如本發(fā)明實施例中的評估代碼文件安全性的方法和裝置對應(yīng)的程序指令/模塊,處理器通過運行存儲在存儲器內(nèi)的軟件程序以及模塊,從而執(zhí)行各種功能應(yīng)用以及數(shù)據(jù)處理,即實現(xiàn)上述的評估代碼文件安全性的方法。存儲器可包括高速隨機存儲器,還可以包括非易失性存儲器,如一個或者多個磁性存儲裝置、閃存、或者其他非易失性固態(tài)存儲器。在一些實例中,存儲器可進(jìn)一步包括相對于處理器遠(yuǎn)程設(shè)置的存儲器,這些遠(yuǎn)程存儲器可以通過網(wǎng)絡(luò)連接至終端。上述網(wǎng)絡(luò)的實例包括但不限于互聯(lián)網(wǎng)、企業(yè)內(nèi)部網(wǎng)、局域網(wǎng)、移動通信網(wǎng)及其組合。處理器可以通過傳輸裝置調(diào)用存儲器存儲的信息及應(yīng)用程序,以執(zhí)行下述步驟:s1:從待檢測的代碼文件中解析出變量函數(shù)以及賦值表達(dá)式;s2:根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù);s3:通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)和預(yù)設(shè)的與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估??蛇x的,上述處理器還可以執(zhí)行如下步驟的程序代碼:對代碼文件進(jìn)行詞法分析,將代碼文件中的字符序列轉(zhuǎn)換為token序列;從token序列中解析出變量函數(shù)以及賦值表達(dá)式??蛇x的,上述處理器還可以執(zhí)行如下步驟的程序代碼:查找步驟:按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為左圓括號的第一token;判斷步驟:在查找到第一token的情況下,判斷與第一token相鄰的前一個遍歷的 token的類別是否為變量;如果是,則從第一token開始查找類別為操作符,取值為右圓括號的第二token,并將第一token與第二token之間的參數(shù)集合與預(yù)設(shè)的正則表達(dá)式相匹配的情況下,將當(dāng)前查找到的函數(shù)記錄為變量函數(shù),返回查找步驟,直至解析出變量函數(shù)??蛇x的,上述處理器還可以執(zhí)行如下步驟的程序代碼:查找步驟:按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為等號的第三token;獲取步驟:在查找到第三token的情況下,獲取與第三token相鄰的前一個遍歷的token,并將獲取到的token的取值記錄為當(dāng)前查找到的賦值表達(dá)式中待賦值的變量;從第三token開始查找類別為操作符,取值為分號的第四token,獲取第三token與第四token之間的一個或多個token,并將一個或多個token記錄為當(dāng)前查找到的賦值表達(dá)式中待計算的表達(dá)式,返回查找步驟,直至解析出賦值表達(dá)式。可選的,上述處理器還可以執(zhí)行如下步驟的程序代碼:從預(yù)設(shè)轉(zhuǎn)碼規(guī)則中查找與變量函數(shù)相匹配的直接調(diào)用函數(shù);計算出賦值表達(dá)式中與每個賦值表達(dá)式的變量對應(yīng)的取值,并在每個賦值表達(dá)式的變量與對應(yīng)的取值之間建立對應(yīng)關(guān)系;采用預(yù)設(shè)轉(zhuǎn)碼規(guī)則和對應(yīng)關(guān)系從直接調(diào)用函數(shù)中識別出原始調(diào)用函數(shù)??蛇x的,上述處理器還可以執(zhí)行如下步驟的程序代碼:從預(yù)設(shè)存儲區(qū)域讀取與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù);對與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)進(jìn)行求和運算,得到安全性評估結(jié)果。作為本發(fā)明的另外一種實施方式,處理器還可以通過傳輸裝置調(diào)用存儲器存儲的信息及應(yīng)用程序,以執(zhí)行下述步驟:s1:從待檢測的代碼文件中解析出變量函數(shù);s2:根據(jù)變量函數(shù)還原出直接調(diào)用函數(shù);s3:通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。采用本發(fā)明實施例,從待檢測的代碼文件中解析出變量函數(shù)以及賦值表達(dá)式的方式,根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù)并通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)和預(yù)設(shè)的與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估,從而實現(xiàn)了提高變量函數(shù)型webshell代碼文件的檢測效率,提升檢測結(jié)果準(zhǔn)確性的技術(shù)效果,進(jìn)而解決了相關(guān)技術(shù)中所提供的針對webshell代碼文件的 安全性檢測方案檢測效率較低,準(zhǔn)確性不高的技術(shù)問題。本領(lǐng)域普通技術(shù)人員可以理解,圖7所示的結(jié)構(gòu)僅為示意,計算機終端也可以是智能手機(如android手機、ios手機等)、平板電腦、掌聲電腦以及移動互聯(lián)網(wǎng)設(shè)備(mobileinternetdevices,簡稱為mid)、pad等終端設(shè)備。圖7其并不對上述電子裝置的結(jié)構(gòu)造成限定。例如,計算機終端還可包括比圖7中所示更多或者更少的組件(如網(wǎng)絡(luò)接口、顯示裝置等),或者具有與圖7所示不同的配置。本領(lǐng)域普通技術(shù)人員可以理解上述實施例的各種方法中的全部或部分步驟是可以通過程序來指令終端設(shè)備相關(guān)的硬件來完成,該程序可以存儲于一計算機可讀存儲介質(zhì)中,存儲介質(zhì)可以包括:閃存盤、只讀存儲器(read-onlymemory,簡稱為rom)、隨機存取器(randomaccessmemory,簡稱為ram)、磁盤或光盤等。實施例4本發(fā)明的實施例還提供了一種存儲介質(zhì)??蛇x地,在本實施例中,上述存儲介質(zhì)可以用于保存上述實施例一所提供的評估代碼文件安全性的方法所執(zhí)行的程序代碼??蛇x地,在本實施例中,上述存儲介質(zhì)可以位于計算機網(wǎng)絡(luò)中計算機終端群中的任意一個計算機終端中,或者位于移動終端群中的任意一個移動終端中??蛇x地,在本實施例中,存儲介質(zhì)被設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:s1:從待檢測的代碼文件中解析出變量函數(shù)以及賦值表達(dá)式;s2:根據(jù)變量函數(shù)和賦值表達(dá)式還原出直接調(diào)用函數(shù)和原始調(diào)用函數(shù);s3:通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)和預(yù)設(shè)的與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。可選的,上述存儲介質(zhì)被還設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:對代碼文件進(jìn)行詞法分析,將代碼文件中的字符序列轉(zhuǎn)換為token序列;從token序列中解析出變量函數(shù)以及賦值表達(dá)式??蛇x的,上述存儲介質(zhì)被還設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:查找步驟:按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為左圓括號的第一token;判斷步驟:在查找到第一token的情況下,判斷與第一token相鄰的前一個遍歷的token的類別是否為變量;如果是,則從第一token開始查找類別為操作符,取值為右圓括號的第二token,并將第一token與第二token之間的參數(shù)集合 與預(yù)設(shè)的正則表達(dá)式相匹配的情況下,將當(dāng)前查找到的函數(shù)記錄為變量函數(shù),返回查找步驟,直至解析出變量函數(shù)??蛇x的,上述存儲介質(zhì)被還設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:查找步驟:按照預(yù)設(shè)順序遍歷token序列中的每個token,查找類別為操作符,取值為等號的第三token;獲取步驟:在查找到第三token的情況下,獲取與第三token相鄰的前一個遍歷的token,并將獲取到的token的取值記錄為當(dāng)前查找到的賦值表達(dá)式中待賦值的變量;從第三token開始查找類別為操作符,取值為分號的第四token,獲取第三token與第四token之間的一個或多個token,并將一個或多個token記錄為當(dāng)前查找到的賦值表達(dá)式中待計算的表達(dá)式,返回查找步驟,直至解析出賦值表達(dá)式??蛇x的,上述存儲介質(zhì)被還設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:從預(yù)設(shè)轉(zhuǎn)碼規(guī)則中查找與變量函數(shù)中相匹配的直接調(diào)用函數(shù);計算出賦值表達(dá)式中與每個賦值表達(dá)式的變量對應(yīng)的取值,并在每個賦值表達(dá)式的變量與對應(yīng)的取值之間建立對應(yīng)關(guān)系;采用預(yù)設(shè)轉(zhuǎn)碼規(guī)則和對應(yīng)關(guān)系從直接調(diào)用函數(shù)中識別出原始調(diào)用函數(shù)。可選的,上述存儲介質(zhì)被還設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:從預(yù)設(shè)存儲區(qū)域讀取與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù);對與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)以及與原始調(diào)用函數(shù)對應(yīng)的安全系數(shù)進(jìn)行求和運算,得到安全性評估結(jié)果??蛇x地,在本實施例的可替代方案中,存儲介質(zhì)被設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:s1:從待檢測的代碼文件中解析出變量函數(shù);s2:根據(jù)變量函數(shù)還原出直接調(diào)用函數(shù);s3:通過預(yù)設(shè)的與直接調(diào)用函數(shù)對應(yīng)的安全系數(shù)對代碼文件的安全性進(jìn)行評估。上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。在本發(fā)明的上述實施例中,對各個實施例的描述都各有側(cè)重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關(guān)描述。在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的技術(shù)內(nèi)容,可通過其它的方式實現(xiàn)。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃分, 僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。另外,在本發(fā)明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可為個人計算機、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:u盤、只讀存儲器(rom,read-onlymemory)、隨機存取存儲器(ram,randomaccessmemory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當(dāng)指出,對于本
技術(shù)領(lǐng)域:
的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。當(dāng)前第1頁12