【摘 要】通過反編譯、分析網(wǎng)頁程序代碼獲取商業(yè)數(shù)字化信息管理系統(tǒng)的技術(shù)參數(shù)和指標(biāo)和跟蹤分析數(shù)據(jù)庫中數(shù)據(jù)變化和數(shù)據(jù)結(jié)構(gòu)從而實現(xiàn)對商業(yè)數(shù)字化信息管理系統(tǒng)功能的二次開發(fā)和無縫融入。
【關(guān)鍵詞】信息管理系統(tǒng) 二次開發(fā) Oracle ASP.net Reflector
目前各種商業(yè)數(shù)字化信息管理應(yīng)用系統(tǒng)的功能定制或二次開發(fā)一般都必須通過開發(fā)商定制,當(dāng)中涉及到的技術(shù)參數(shù)和指標(biāo)絕大部分開發(fā)商是不向客戶公開的。通過開發(fā)商定制和開發(fā)功能,往往需要向其支付不菲的服務(wù)費或技術(shù)支持費用,系統(tǒng)的運行和管理成本非常高。其次,由于開發(fā)商在設(shè)置功能需求時只能通過書面和有限的言語交流的形式與客戶溝通,導(dǎo)致最終的應(yīng)用功能與管理者的意圖存在一定的偏差。而管理者由于知識層面的局限,又無法將自己的管理意圖用程序的方式表現(xiàn)出來,導(dǎo)致了 “懂編程的不懂管理,懂管理的不懂編程”,最終的程序總是無法表現(xiàn)出管理方的完全真實意圖。
所以,一個成熟的管理系統(tǒng)往往是由管理者按照自己的意圖制定出功能再通過實踐運行反復(fù)修正而得來的。湖南工業(yè)大學(xué)科技學(xué)院目前的教學(xué)管理信息系統(tǒng)使用的是杭州正方公司開發(fā)的“正方現(xiàn)代教學(xué)管理信息系統(tǒng)”,后面主要以這套系統(tǒng)就功能的添加進(jìn)行探究。由于該系統(tǒng)是為面向通用性學(xué)分制管理高校教學(xué)需求而開發(fā)的。在系統(tǒng)運行過程中,管理的多樣性與通用功能的限性產(chǎn)生了較大的沖突。我們本次探索的目的是,在基于原系統(tǒng)的功能下,使用一些簡單的技術(shù)來實現(xiàn)對該系統(tǒng)的二次開發(fā)。這樣可以利用原系統(tǒng)的部分模塊(如登錄模塊)使用系統(tǒng)數(shù)據(jù)中的數(shù)據(jù)實現(xiàn)一個完全自主的功能需求,而無需重新設(shè)計一個系統(tǒng),達(dá)到了提高系統(tǒng)的使用率,節(jié)省了重新建立一套的軟件和硬件開銷,最主要的是可以和原系統(tǒng)融為一體,用戶不需要在兩個不同的系統(tǒng)中反復(fù)切換即可實現(xiàn)預(yù)期的功能。
與常見的數(shù)字化信息管理系統(tǒng)一樣,該教學(xué)管理系統(tǒng)主要基于數(shù)據(jù)庫系統(tǒng)和WEB信息發(fā)布系統(tǒng)兩方面組成,用戶通過訪問網(wǎng)站實現(xiàn)系統(tǒng)的功能。目前的系統(tǒng)使用的是Windows2003的操作系統(tǒng)及其附帶的信息服務(wù)管理器(IIS)加上一個Oracle數(shù)據(jù)庫系統(tǒng)組成。開發(fā)商為防止源代碼及相關(guān)技術(shù)參數(shù)的泄露,對所有源代碼進(jìn)行了封裝,將其封裝至一個動態(tài)鏈接庫當(dāng)中。通過簡單的修改網(wǎng)頁文件來實現(xiàn)功能的添加是無法實現(xiàn)的。我們想通過對以下幾個方面進(jìn)行修改,從而實現(xiàn)對系統(tǒng)網(wǎng)站功能的添加。
一、分析網(wǎng)站源代碼獲取系統(tǒng)相關(guān)信息并用于自主開發(fā)功能頁面中
通過對系統(tǒng)源代碼的分析可以了解開發(fā)商設(shè)計程序及功能實現(xiàn)的細(xì)節(jié)。介于本系統(tǒng)對所有源代碼進(jìn)行了封裝,無法直接掌握源代碼內(nèi)容,我們借助一款反編譯軟件查詢了系統(tǒng)的部分程序代碼。這款軟件的名字叫.NET Reflector(如下圖),Reflector是一個由微軟員工Lutz Roeder編寫的免費程序。它可以將.NET程序集中的中間語言反編譯成C#或者Visual Basic代碼。
(一)查看Session對象,獲取相關(guān)信息
利用Reflector工具,我們可以方便的查詢到,系統(tǒng)中的Session對象使用情況。Session對象是ASP用于存儲特定的用戶會話所需的信息 。如:
登錄模塊中對用戶身份認(rèn)證后會將登錄的賬戶信息存放在Session對象中(ID為\"username\")。在后面的功能網(wǎng)頁中,如需要判斷當(dāng)前登錄的用戶賬號,只需要在代碼中引用Session[\"username\"]信息,然后用過數(shù)據(jù)庫訪問獲取該登錄賬戶的數(shù)據(jù)。這就而實現(xiàn)自主開發(fā)功能頁面對當(dāng)前教學(xué)管理系統(tǒng)用戶登錄模塊的共享。
相對于Session,ASP還有另外一個對象Application用于存放全局用戶信息。我們在分析源代碼的時候也可以注意這個對象中的數(shù)據(jù)定義,為我們在后面的功能開發(fā)中獲取更多的信息。
(二)原系統(tǒng)的命名空間引用
通過分析系統(tǒng)封裝的動態(tài)連接庫文件,可以獲取原封裝文件中的代碼被封裝的命名空間名稱。通過在程序代碼前加上using引用,可在自主開發(fā)功能頁面中引用該動態(tài)鏈接庫的全部代碼。方法如下:
using System;
using zjdx; //其中zjdx即為動態(tài)鏈接庫名稱
引用后,可像訪問命名空間一樣訪問其中的類以及類中的過程調(diào)用。從而實現(xiàn)對原系統(tǒng)的功能過程的調(diào)用。
(三)獲取系統(tǒng)連接數(shù)據(jù)庫的關(guān)鍵詞并用于自主開發(fā)功能頁面數(shù)據(jù)連接
通過分析網(wǎng)站的配置文件如WEB.CONFIG可獲取一些網(wǎng)站的配置信息,其中就包括網(wǎng)站連接數(shù)據(jù)庫所使用的連接字符串以及用戶和密碼。本例中的用戶名連接字符串和數(shù)據(jù)庫登錄密碼存放在WEB.CONFIG文件中的AppSettings節(jié)點中。系統(tǒng)連接數(shù)據(jù)庫時需要通過特定函數(shù)調(diào)用其相關(guān)的ID來獲取,方法如下:
ConfigurationSettings.AppSettings[\"MyConn\"]; //獲取數(shù)據(jù)庫連接字符串
ConfigurationSettings.AppSettings[\"MyPwd\"]; //獲取數(shù)據(jù)庫登錄密碼
通過查詢WEB.CONFIG文件得知這兩個節(jié)點對應(yīng)的字符串為:
\"Data Source=orcl;User Id=zfxfzb;Password=XXXXXX\"
獲取了以上的關(guān)鍵信息后,我們即連接數(shù)據(jù)庫系統(tǒng),獲取系統(tǒng)中的相關(guān)數(shù)據(jù)了。通過以上方法獲取的原教學(xué)管理系統(tǒng)使用的登錄密碼后發(fā)現(xiàn)其為一串加過密的數(shù)據(jù)信息。我們可以將密碼明碼直接加到連接字符串中的“password”后面,不過因為數(shù)據(jù)庫系統(tǒng)出于安全方面的考慮會定時更新密碼,為方便起見我們分析了封裝動態(tài)鏈接庫,發(fā)現(xiàn)可直接引用其內(nèi)部的解密函數(shù)恢復(fù)將這組加密了的密碼轉(zhuǎn)換為明碼。從而實現(xiàn)與原系統(tǒng)的無縫連接。
二、通過分析數(shù)據(jù)庫獲取系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)
不論哪種應(yīng)用系統(tǒng)其最終歸結(jié)都是對數(shù)據(jù)的訪問和處理。按照程序開發(fā)的過程中的數(shù)據(jù)流程圖來分析,每一個功能就可以對照一組數(shù)據(jù)流程。反過來,通過對數(shù)據(jù)庫中數(shù)據(jù)的分析,加上對已知功能運行時的數(shù)據(jù)庫各表之間的數(shù)據(jù)變化進(jìn)行跟蹤可以得到數(shù)據(jù)庫中各個表與各個功能的關(guān)系。掌握了這些關(guān)系,我們可以通過獲取這些相關(guān)的表中的數(shù)據(jù)予以分析,從而得到系統(tǒng)的運行信息。
(一)數(shù)據(jù)結(jié)構(gòu)的分析
在ORACLE中,我們可以非常方便的查詢數(shù)據(jù)庫各數(shù)據(jù)對象之間的關(guān)系。將這些關(guān)系組織起來就得到了該系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)。但是僅僅通過對系統(tǒng)已知的功能操作這些有限的信息來分析整個系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)是一個非常漫長的過程。我們也可以只分析與我們相關(guān)的部分表或視圖的數(shù)據(jù)關(guān)系,如:獲取用戶信息及登錄密碼的存放位置、系統(tǒng)重要數(shù)據(jù)(如成績記載記錄)的存放位置、系統(tǒng)日志的存放位置等等信息。查詢執(zhí)行系統(tǒng)的某項功能導(dǎo)致ORACLE中哪些表記錄變化可以通過以下方法實現(xiàn),在執(zhí)行功能前后分別執(zhí)行以下SQL命令:
select table_name,NUM_ROWS from user_tables;
通過比較前后兩次執(zhí)行的結(jié)果就可以方便的得出哪些表格的數(shù)據(jù)發(fā)生了增減。
(二)通過修改已知的存儲過程(procedure)實現(xiàn)系統(tǒng)功能
在數(shù)據(jù)庫系統(tǒng)中,有很多數(shù)據(jù)處理的操作是放在服務(wù)器中進(jìn)行的,我們通過調(diào)用預(yù)先設(shè)置好的存儲過程,將一些簡單的操作參數(shù)傳遞給數(shù)據(jù)庫再由數(shù)據(jù)庫來進(jìn)一步的進(jìn)行數(shù)據(jù)處理。我們可以通過修改系統(tǒng)存放在數(shù)據(jù)庫中的存儲過程,給其添加適當(dāng)?shù)闹噶?,讓系統(tǒng)在調(diào)用存儲過程的同時執(zhí)行我們需要執(zhí)行的操作,或在存儲過程中添加操作的日志,然后通過后面的代碼來查詢?nèi)罩精@取系統(tǒng)在什么時候訪問過哪些存儲過程。
(三)通過修改觸發(fā)器(trigger)監(jiān)控某些關(guān)鍵的表數(shù)據(jù)變化
如果已知原系統(tǒng)的某些功能會對一些表進(jìn)行數(shù)據(jù)修改,因為這些程序已經(jīng)被封裝了,無法修改,但是又想要為這些功能增加一些聯(lián)動的操作。我們可以通過為這些表格建立一個觸發(fā)器來實現(xiàn)。比如需要對成績子系統(tǒng)增加一個數(shù)據(jù)安全監(jiān)控的功能,來防止通過網(wǎng)頁入侵的方式來篡改成績,我們可以為成績表添加一個觸發(fā)器,只要數(shù)據(jù)庫中有對成績表數(shù)據(jù)進(jìn)行修改的操作,我們都可以對數(shù)據(jù)進(jìn)行一次審核,或生成一個日志文件再用后面的程序來比較操作員的日志和成績修改的日志是否匹配,從而判斷成績的修改是否為非法操作。創(chuàng)建觸發(fā)器可以通過以下命令實現(xiàn):
create or replace trigger CJB_TRG_UPD 觸發(fā)器名稱
after update or insert or delete on cjb 成績表為CJB 觸發(fā)方式為更新操作
for each row 對每行更新均觸發(fā)
三、新增功能與原系統(tǒng)的嵌入方式
自主開發(fā)功能頁面設(shè)計好后如何與原系統(tǒng)融為一體,成為原系統(tǒng)的功能擴展部分。這涉及到新增功能操作界面是否可以順利訪問,人機交互界面是否有好等。通常我們可以通過以下幾個方法將自主功能頁面嵌入到原系統(tǒng)中。
(一)使用原系統(tǒng)預(yù)留的菜單接口
正方現(xiàn)代教學(xué)管理信息系統(tǒng)在設(shè)計時采用的是靈活的菜單接口,管理員可以根據(jù)需要靈活的定義系統(tǒng)的功能菜單及其所對應(yīng)的頁面文件。利用該菜單管理系統(tǒng)可以將自主功能頁面無縫的融入管理系統(tǒng)當(dāng)中,如網(wǎng)頁設(shè)計風(fēng)格與原系統(tǒng)保持一致,用戶幾乎不會發(fā)現(xiàn)新增的自主功能頁面與原系統(tǒng)的區(qū)別。
(二)更改頁面文件,添加鏈接
如所使用的系統(tǒng)未提供菜單接口,我們可以通過修改登錄后用戶打開的主頁面實現(xiàn)自主功能頁面鏈接的嵌入。因為商業(yè)網(wǎng)站只能將頁面的代碼封裝在動態(tài)鏈接庫當(dāng)中,而無法將頁面文件進(jìn)行封裝。IIS在發(fā)布網(wǎng)站時仍然是先打開網(wǎng)頁的頁面文件,再根據(jù)頁面文件中的注釋裝入頁面文件代碼。因此,我們可以方便的直接在原系統(tǒng)的主頁面導(dǎo)航菜單中添加行(或列),加入HTML標(biāo)記鏈接使其指向自主功能頁面的地址。需要注意的是為保證系統(tǒng)的美觀和完美的嵌入,菜單鏈接的CSS樣式設(shè)置必須和原系統(tǒng)的保持一致。或者通過CSS參加一個新的層并將其定義在最頂端,定義一個浮動的功能菜單或一致指向功能頁面的鏈接。
以上是我們通過對現(xiàn)行使用的數(shù)字化信息管理系統(tǒng)進(jìn)行分析和摸索總結(jié)出的一套自主功能開發(fā)模式。通過該模式,可以簡單快捷的對已有系統(tǒng)按照需求自由添加功能,同時又避免將需求發(fā)回原開發(fā)商進(jìn)行開發(fā)導(dǎo)致的系統(tǒng)功能更新慢、維護(hù)和更新成本高的缺點。另外,還可以根據(jù)使用情況隨時對功能進(jìn)行設(shè)置和調(diào)整。實現(xiàn)了將管理者的管理理念完美的融入到管理系統(tǒng)中。
參考文獻(xiàn):
[1]何翠平著.HTML從入門到精通[M].電子工業(yè)出版社,2007,7.
[2]邱郁惠著.精通CSS與HTML設(shè)計模式[M],人民郵電出版社,2008.9
[3]吳濤主編,網(wǎng)站全程設(shè)計技術(shù)(修訂本),清華大學(xué)出版社,2006.7
[4]任樹華,Oracle 10g應(yīng)用指導(dǎo)與案例精講,機械工業(yè)出版社,2007.2
[5][美]G.Andrew Duthie , Microsoft ASP.NET程序設(shè)計[J],清華大學(xué)出版社,2002
注:本文系2012年湖南省大學(xué)生研究性學(xué)習(xí)和創(chuàng)新性實驗計劃項目