论文部分内容阅读
【摘 要】通过反编译、分析网页程序代码获取商业数字化信息管理系统的技术参数和指标和跟踪分析数据库中数据变化和数据结构从而实现对商业数字化信息管理系统功能的二次开发和无缝融入。
【关键词】信息管理系统 二次开发 Oracle ASP.net Reflector
目前各种商业数字化信息管理应用系统的功能定制或二次开发一般都必须通过开发商定制,当中涉及到的技术参数和指标绝大部分开发商是不向客户公开的。通过开发商定制和开发功能,往往需要向其支付不菲的服务费或技术支持费用,系统的运行和管理成本非常高。其次,由于开发商在设置功能需求时只能通过书面和有限的言语交流的形式与客户沟通,导致最终的应用功能与管理者的意图存在一定的偏差。而管理者由于知识层面的局限,又无法将自己的管理意图用程序的方式表现出来,导致了 “懂编程的不懂管理,懂管理的不懂编程”,最终的程序总是无法表现出管理方的完全真实意图。
所以,一个成熟的管理系统往往是由管理者按照自己的意图制定出功能再通过实践运行反复修正而得来的。湖南工业大学科技学院目前的教学管理信息系统使用的是杭州正方公司开发的“正方现代教学管理信息系统”,后面主要以这套系统就功能的添加进行探究。由于该系统是为面向通用性学分制管理高校教学需求而开发的。在系统运行过程中,管理的多样性与通用功能的限性产生了较大的冲突。我们本次探索的目的是,在基于原系统的功能下,使用一些简单的技术来实现对该系统的二次开发。这样可以利用原系统的部分模块(如登录模块)使用系统数据中的数据实现一个完全自主的功能需求,而无需重新设计一个系统,达到了提高系统的使用率,节省了重新建立一套的软件和硬件开销,最主要的是可以和原系统融为一体,用户不需要在两个不同的系统中反复切换即可实现预期的功能。
与常见的数字化信息管理系统一样,该教学管理系统主要基于数据库系统和WEB信息发布系统两方面组成,用户通过访问网站实现系统的功能。目前的系统使用的是Windows2003的操作系统及其附带的信息服务管理器(IIS)加上一个Oracle数据库系统组成。开发商为防止源代码及相关技术参数的泄露,对所有源代码进行了封装,将其封装至一个动态链接库当中。通过简单的修改网页文件来实现功能的添加是无法实现的。我们想通过对以下几个方面进行修改,从而实现对系统网站功能的添加。
一、分析网站源代码获取系统相关信息并用于自主开发功能页面中
通过对系统源代码的分析可以了解开发商设计程序及功能实现的细节。介于本系统对所有源代码进行了封装,无法直接掌握源代码内容,我们借助一款反编译软件查询了系统的部分程序代码。这款软件的名字叫.NET Reflector(如下图),Reflector是一个由微软员工Lutz Roeder编写的免费程序。它可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。
(一)查看Session对象,获取相关信息
利用Reflector工具,我们可以方便的查询到,系统中的Session对象使用情况。Session对象是ASP用于存储特定的用户会话所需的信息 。如:
登录模块中对用户身份认证后会将登录的账户信息存放在Session对象中(ID为"username")。在后面的功能网页中,如需要判断当前登录的用户账号,只需要在代码中引用Session["username"]信息,然后用过数据库访问获取该登录账户的数据。这就而实现自主开发功能页面对当前教学管理系统用户登录模块的共享。
相对于Session,ASP还有另外一个对象Application用于存放全局用户信息。我们在分析源代码的时候也可以注意这个对象中的数据定义,为我们在后面的功能开发中获取更多的信息。
(二)原系统的命名空间引用
通过分析系统封装的动态连接库文件,可以获取原封装文件中的代码被封装的命名空间名称。通过在程序代码前加上using引用,可在自主开发功能页面中引用该动态链接库的全部代码。方法如下:
using System;
using zjdx; //其中zjdx即为动态链接库名称
引用后,可像访问命名空间一样访问其中的类以及类中的过程调用。从而实现对原系统的功能过程的调用。
(三)获取系统连接数据库的关键词并用于自主开发功能页面数据连接
通过分析网站的配置文件如WEB.CONFIG可获取一些网站的配置信息,其中就包括网站连接数据库所使用的连接字符串以及用户和密码。本例中的用户名连接字符串和数据库登录密码存放在WEB.CONFIG文件中的AppSettings节点中。系统连接数据库时需要通过特定函数调用其相关的ID来获取,方法如下:
ConfigurationSettings.AppSettings["MyConn"]; //获取数据库连接字符串
ConfigurationSettings.AppSettings["MyPwd"]; //获取数据库登录密码
通过查询WEB.CONFIG文件得知这两个节点对应的字符串为:
"Data Source=orcl;User Id=zfxfzb;Password=XXXXXX"
获取了以上的关键信息后,我们即连接数据库系统,获取系统中的相关数据了。通过以上方法获取的原教学管理系统使用的登录密码后发现其为一串加过密的数据信息。我们可以将密码明码直接加到连接字符串中的“password”后面,不过因为数据库系统出于安全方面的考虑会定时更新密码,为方便起见我们分析了封装动态链接库,发现可直接引用其内部的解密函数恢复将这组加密了的密码转换为明码。从而实现与原系统的无缝连接。 二、通过分析数据库获取系统的数据结构
不论哪种应用系统其最终归结都是对数据的访问和处理。按照程序开发的过程中的数据流程图来分析,每一个功能就可以对照一组数据流程。反过来,通过对数据库中数据的分析,加上对已知功能运行时的数据库各表之间的数据变化进行跟踪可以得到数据库中各个表与各个功能的关系。掌握了这些关系,我们可以通过获取这些相关的表中的数据予以分析,从而得到系统的运行信息。
(一)数据结构的分析
在ORACLE中,我们可以非常方便的查询数据库各数据对象之间的关系。将这些关系组织起来就得到了该系统的数据结构。但是仅仅通过对系统已知的功能操作这些有限的信息来分析整个系统的数据结构是一个非常漫长的过程。我们也可以只分析与我们相关的部分表或视图的数据关系,如:获取用户信息及登录密码的存放位置、系统重要数据(如成绩记载记录)的存放位置、系统日志的存放位置等等信息。查询执行系统的某项功能导致ORACLE中哪些表记录变化可以通过以下方法实现,在执行功能前后分别执行以下SQL命令:
select table_name,NUM_ROWS from user_tables;
通过比较前后两次执行的结果就可以方便的得出哪些表格的数据发生了增减。
(二)通过修改已知的存储过程(procedure)实现系统功能
在数据库系统中,有很多数据处理的操作是放在服务器中进行的,我们通过调用预先设置好的存储过程,将一些简单的操作参数传递给数据库再由数据库来进一步的进行数据处理。我们可以通过修改系统存放在数据库中的存储过程,给其添加适当的指令,让系统在调用存储过程的同时执行我们需要执行的操作,或在存储过程中添加操作的日志,然后通过后面的代码来查询日志获取系统在什么时候访问过哪些存储过程。
(三)通过修改触发器(trigger)监控某些关键的表数据变化
如果已知原系统的某些功能会对一些表进行数据修改,因为这些程序已经被封装了,无法修改,但是又想要为这些功能增加一些联动的操作。我们可以通过为这些表格建立一个触发器来实现。比如需要对成绩子系统增加一个数据安全监控的功能,来防止通过网页入侵的方式来篡改成绩,我们可以为成绩表添加一个触发器,只要数据库中有对成绩表数据进行修改的操作,我们都可以对数据进行一次审核,或生成一个日志文件再用后面的程序来比较操作员的日志和成绩修改的日志是否匹配,从而判断成绩的修改是否为非法操作。创建触发器可以通过以下命令实现:
create or replace trigger CJB_TRG_UPD 触发器名称
after update or insert or delete on cjb 成绩表为CJB 触发方式为更新操作
for each row 对每行更新均触发
三、新增功能与原系统的嵌入方式
自主开发功能页面设计好后如何与原系统融为一体,成为原系统的功能扩展部分。这涉及到新增功能操作界面是否可以顺利访问,人机交互界面是否有好等。通常我们可以通过以下几个方法将自主功能页面嵌入到原系统中。
(一)使用原系统预留的菜单接口
正方现代教学管理信息系统在设计时采用的是灵活的菜单接口,管理员可以根据需要灵活的定义系统的功能菜单及其所对应的页面文件。利用该菜单管理系统可以将自主功能页面无缝的融入管理系统当中,如网页设计风格与原系统保持一致,用户几乎不会发现新增的自主功能页面与原系统的区别。
(二)更改页面文件,添加链接
如所使用的系统未提供菜单接口,我们可以通过修改登录后用户打开的主页面实现自主功能页面链接的嵌入。因为商业网站只能将页面的代码封装在动态链接库当中,而无法将页面文件进行封装。IIS在发布网站时仍然是先打开网页的页面文件,再根据页面文件中的注释装入页面文件代码。因此,我们可以方便的直接在原系统的主页面导航菜单中添加行(或列),加入HTML标记链接使其指向自主功能页面的地址。需要注意的是为保证系统的美观和完美的嵌入,菜单链接的CSS样式设置必须和原系统的保持一致。或者通过CSS参加一个新的层并将其定义在最顶端,定义一个浮动的功能菜单或一致指向功能页面的链接。
以上是我们通过对现行使用的数字化信息管理系统进行分析和摸索总结出的一套自主功能开发模式。通过该模式,可以简单快捷的对已有系统按照需求自由添加功能,同时又避免将需求发回原开发商进行开发导致的系统功能更新慢、维护和更新成本高的缺点。另外,还可以根据使用情况随时对功能进行设置和调整。实现了将管理者的管理理念完美的融入到管理系统中。
参考文献:
[1]何翠平著.HTML从入门到精通[M].电子工业出版社,2007,7.
[2]邱郁惠著.精通CSS与HTML设计模式[M],人民邮电出版社,2008.9
[3]吴涛主编,网站全程设计技术(修订本),清华大学出版社,2006.7
[4]任树华,Oracle 10g应用指导与案例精讲,机械工业出版社,2007.2
[5][美]G.Andrew Duthie , Microsoft ASP.NET程序设计[J],清华大学出版社,2002
注:本文系2012年湖南省大学生研究性学习和创新性实验计划项目
【关键词】信息管理系统 二次开发 Oracle ASP.net Reflector
目前各种商业数字化信息管理应用系统的功能定制或二次开发一般都必须通过开发商定制,当中涉及到的技术参数和指标绝大部分开发商是不向客户公开的。通过开发商定制和开发功能,往往需要向其支付不菲的服务费或技术支持费用,系统的运行和管理成本非常高。其次,由于开发商在设置功能需求时只能通过书面和有限的言语交流的形式与客户沟通,导致最终的应用功能与管理者的意图存在一定的偏差。而管理者由于知识层面的局限,又无法将自己的管理意图用程序的方式表现出来,导致了 “懂编程的不懂管理,懂管理的不懂编程”,最终的程序总是无法表现出管理方的完全真实意图。
所以,一个成熟的管理系统往往是由管理者按照自己的意图制定出功能再通过实践运行反复修正而得来的。湖南工业大学科技学院目前的教学管理信息系统使用的是杭州正方公司开发的“正方现代教学管理信息系统”,后面主要以这套系统就功能的添加进行探究。由于该系统是为面向通用性学分制管理高校教学需求而开发的。在系统运行过程中,管理的多样性与通用功能的限性产生了较大的冲突。我们本次探索的目的是,在基于原系统的功能下,使用一些简单的技术来实现对该系统的二次开发。这样可以利用原系统的部分模块(如登录模块)使用系统数据中的数据实现一个完全自主的功能需求,而无需重新设计一个系统,达到了提高系统的使用率,节省了重新建立一套的软件和硬件开销,最主要的是可以和原系统融为一体,用户不需要在两个不同的系统中反复切换即可实现预期的功能。
与常见的数字化信息管理系统一样,该教学管理系统主要基于数据库系统和WEB信息发布系统两方面组成,用户通过访问网站实现系统的功能。目前的系统使用的是Windows2003的操作系统及其附带的信息服务管理器(IIS)加上一个Oracle数据库系统组成。开发商为防止源代码及相关技术参数的泄露,对所有源代码进行了封装,将其封装至一个动态链接库当中。通过简单的修改网页文件来实现功能的添加是无法实现的。我们想通过对以下几个方面进行修改,从而实现对系统网站功能的添加。
一、分析网站源代码获取系统相关信息并用于自主开发功能页面中
通过对系统源代码的分析可以了解开发商设计程序及功能实现的细节。介于本系统对所有源代码进行了封装,无法直接掌握源代码内容,我们借助一款反编译软件查询了系统的部分程序代码。这款软件的名字叫.NET Reflector(如下图),Reflector是一个由微软员工Lutz Roeder编写的免费程序。它可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。
(一)查看Session对象,获取相关信息
利用Reflector工具,我们可以方便的查询到,系统中的Session对象使用情况。Session对象是ASP用于存储特定的用户会话所需的信息 。如:
登录模块中对用户身份认证后会将登录的账户信息存放在Session对象中(ID为"username")。在后面的功能网页中,如需要判断当前登录的用户账号,只需要在代码中引用Session["username"]信息,然后用过数据库访问获取该登录账户的数据。这就而实现自主开发功能页面对当前教学管理系统用户登录模块的共享。
相对于Session,ASP还有另外一个对象Application用于存放全局用户信息。我们在分析源代码的时候也可以注意这个对象中的数据定义,为我们在后面的功能开发中获取更多的信息。
(二)原系统的命名空间引用
通过分析系统封装的动态连接库文件,可以获取原封装文件中的代码被封装的命名空间名称。通过在程序代码前加上using引用,可在自主开发功能页面中引用该动态链接库的全部代码。方法如下:
using System;
using zjdx; //其中zjdx即为动态链接库名称
引用后,可像访问命名空间一样访问其中的类以及类中的过程调用。从而实现对原系统的功能过程的调用。
(三)获取系统连接数据库的关键词并用于自主开发功能页面数据连接
通过分析网站的配置文件如WEB.CONFIG可获取一些网站的配置信息,其中就包括网站连接数据库所使用的连接字符串以及用户和密码。本例中的用户名连接字符串和数据库登录密码存放在WEB.CONFIG文件中的AppSettings节点中。系统连接数据库时需要通过特定函数调用其相关的ID来获取,方法如下:
ConfigurationSettings.AppSettings["MyConn"]; //获取数据库连接字符串
ConfigurationSettings.AppSettings["MyPwd"]; //获取数据库登录密码
通过查询WEB.CONFIG文件得知这两个节点对应的字符串为:
"Data Source=orcl;User Id=zfxfzb;Password=XXXXXX"
获取了以上的关键信息后,我们即连接数据库系统,获取系统中的相关数据了。通过以上方法获取的原教学管理系统使用的登录密码后发现其为一串加过密的数据信息。我们可以将密码明码直接加到连接字符串中的“password”后面,不过因为数据库系统出于安全方面的考虑会定时更新密码,为方便起见我们分析了封装动态链接库,发现可直接引用其内部的解密函数恢复将这组加密了的密码转换为明码。从而实现与原系统的无缝连接。 二、通过分析数据库获取系统的数据结构
不论哪种应用系统其最终归结都是对数据的访问和处理。按照程序开发的过程中的数据流程图来分析,每一个功能就可以对照一组数据流程。反过来,通过对数据库中数据的分析,加上对已知功能运行时的数据库各表之间的数据变化进行跟踪可以得到数据库中各个表与各个功能的关系。掌握了这些关系,我们可以通过获取这些相关的表中的数据予以分析,从而得到系统的运行信息。
(一)数据结构的分析
在ORACLE中,我们可以非常方便的查询数据库各数据对象之间的关系。将这些关系组织起来就得到了该系统的数据结构。但是仅仅通过对系统已知的功能操作这些有限的信息来分析整个系统的数据结构是一个非常漫长的过程。我们也可以只分析与我们相关的部分表或视图的数据关系,如:获取用户信息及登录密码的存放位置、系统重要数据(如成绩记载记录)的存放位置、系统日志的存放位置等等信息。查询执行系统的某项功能导致ORACLE中哪些表记录变化可以通过以下方法实现,在执行功能前后分别执行以下SQL命令:
select table_name,NUM_ROWS from user_tables;
通过比较前后两次执行的结果就可以方便的得出哪些表格的数据发生了增减。
(二)通过修改已知的存储过程(procedure)实现系统功能
在数据库系统中,有很多数据处理的操作是放在服务器中进行的,我们通过调用预先设置好的存储过程,将一些简单的操作参数传递给数据库再由数据库来进一步的进行数据处理。我们可以通过修改系统存放在数据库中的存储过程,给其添加适当的指令,让系统在调用存储过程的同时执行我们需要执行的操作,或在存储过程中添加操作的日志,然后通过后面的代码来查询日志获取系统在什么时候访问过哪些存储过程。
(三)通过修改触发器(trigger)监控某些关键的表数据变化
如果已知原系统的某些功能会对一些表进行数据修改,因为这些程序已经被封装了,无法修改,但是又想要为这些功能增加一些联动的操作。我们可以通过为这些表格建立一个触发器来实现。比如需要对成绩子系统增加一个数据安全监控的功能,来防止通过网页入侵的方式来篡改成绩,我们可以为成绩表添加一个触发器,只要数据库中有对成绩表数据进行修改的操作,我们都可以对数据进行一次审核,或生成一个日志文件再用后面的程序来比较操作员的日志和成绩修改的日志是否匹配,从而判断成绩的修改是否为非法操作。创建触发器可以通过以下命令实现:
create or replace trigger CJB_TRG_UPD 触发器名称
after update or insert or delete on cjb 成绩表为CJB 触发方式为更新操作
for each row 对每行更新均触发
三、新增功能与原系统的嵌入方式
自主开发功能页面设计好后如何与原系统融为一体,成为原系统的功能扩展部分。这涉及到新增功能操作界面是否可以顺利访问,人机交互界面是否有好等。通常我们可以通过以下几个方法将自主功能页面嵌入到原系统中。
(一)使用原系统预留的菜单接口
正方现代教学管理信息系统在设计时采用的是灵活的菜单接口,管理员可以根据需要灵活的定义系统的功能菜单及其所对应的页面文件。利用该菜单管理系统可以将自主功能页面无缝的融入管理系统当中,如网页设计风格与原系统保持一致,用户几乎不会发现新增的自主功能页面与原系统的区别。
(二)更改页面文件,添加链接
如所使用的系统未提供菜单接口,我们可以通过修改登录后用户打开的主页面实现自主功能页面链接的嵌入。因为商业网站只能将页面的代码封装在动态链接库当中,而无法将页面文件进行封装。IIS在发布网站时仍然是先打开网页的页面文件,再根据页面文件中的注释装入页面文件代码。因此,我们可以方便的直接在原系统的主页面导航菜单中添加行(或列),加入HTML标记链接使其指向自主功能页面的地址。需要注意的是为保证系统的美观和完美的嵌入,菜单链接的CSS样式设置必须和原系统的保持一致。或者通过CSS参加一个新的层并将其定义在最顶端,定义一个浮动的功能菜单或一致指向功能页面的链接。
以上是我们通过对现行使用的数字化信息管理系统进行分析和摸索总结出的一套自主功能开发模式。通过该模式,可以简单快捷的对已有系统按照需求自由添加功能,同时又避免将需求发回原开发商进行开发导致的系统功能更新慢、维护和更新成本高的缺点。另外,还可以根据使用情况随时对功能进行设置和调整。实现了将管理者的管理理念完美的融入到管理系统中。
参考文献:
[1]何翠平著.HTML从入门到精通[M].电子工业出版社,2007,7.
[2]邱郁惠著.精通CSS与HTML设计模式[M],人民邮电出版社,2008.9
[3]吴涛主编,网站全程设计技术(修订本),清华大学出版社,2006.7
[4]任树华,Oracle 10g应用指导与案例精讲,机械工业出版社,2007.2
[5][美]G.Andrew Duthie , Microsoft ASP.NET程序设计[J],清华大学出版社,2002
注:本文系2012年湖南省大学生研究性学习和创新性实验计划项目