| 
				 一、引言 
在计算机专业课教学中,上机考试是检验学生学习效果,考察学生解决问题能力的重要手段。目前广泛应用的网络环境为上机考试提供了必要的硬件支撑。例如,学生可利用网络下载考题,还可将上机考试的结果文件发往指定的服务器目录。但基于网络的计算机考试也带来了一些新的问题,例如在采用共享目录上传考试结果的考试系统中,考生不但能看到他人的考试结果文件,而且可以随意拷贝、更改甚至删除他人的考试结果文件。因此,构建一个安全可靠的考试环境对于网络环境下的计算机上机考试是至关重要的。本文采用ASP编程语言和Access数据库实现了一个网络环境下的计算机上机考试管理系统,可对考试环境进行全面的控制和管理,满足了网络环境下的计算机上机考试对监考环境安全性、可控性的要求。 
二、系统构成 
本系统采用模块化结构设计,系统组成框图见下图所示: 
 
  
 
系统组成框图 
系统由教师模块和考生模块两部分组成。教师模块包括监考教师管理(监考教师注册、删除、修改密码)、试题管理(上传试题、删除试题、指定当前考试题)、考生管理(考生添加、修改、删除、已注册考生浏览)、考试过程管理(下达开考指令、下达结束考试指令)、考试结果文件管理(按学号或姓名查询、删除)等,考生模块则包括考生注册、考试状态查询、试题下载、考试结果文件管理(上传、浏览、删除)等。 
三、技术要点 
鉴于ASP编程语言已为广大编程人员所熟知,下面仅对系统设计与实现的关键技术要点作一介绍,希望能对大家有所启迪。 
1.     二次用户身份鉴别 
由图1可知系统模块划分为教师模块和考生模块两大类,教师模块禁止考生非法访问,要求系统能够抵御诸如“or ‘1’=‘1’”等用户名密码攻击手段。这可通过在每个教师模块的ASP代码中嵌入二次用户身份鉴别代码来实现。以监考教师模块为例,首先设计一个普通的用户登录界面,包括用户名和口令。在后台处理程序中主要完成以下工作:将用户输入的用户名和口令与数据库存储内容进行比对,若符合条件则从数据库中取出记录标识ID并用Request.QueryString方法传递给下一页面,同时将用户输入的用户名和口令存储到Session变量中,在进入下一页面时将ID、用户名、密码取出,再次进行用户身份鉴别。 
首次用户身份鉴别代码如下: 
<%sql="select id,name,uname,pword from supervisors where uname='"+username+"' and pword='"+password+"'" 
     connstr= "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=false;Data Source=" & server.mappath("exam.mdb") 
    Set Conn = Server.CreateObject("ADODB.Connection") 
    Conn.Open(connstr) 
    Set rs = Conn.Execute(sql) 
    if rs.eof = True then 
       rs.close 
 %> 
<script language ="javascript" > 
     window.alert("非法用户!"); 
     location.href="index.htm"; 
</script> 
<% else   ‘验证通过,转到examadmin.asp页面 
       Session("username")=username 
       Session("password")=password 
 %> 
<script language ="javascript" > 
     location.href="examadmin.asp?id=<%=rs("id")%>&name=<%=rs("name")%>"; 
</script> 
<%end if%> 
二次用户身份鉴别代码如下: 
<%id=Request.QueryString(“id”) 
username=Session("username") 
password=Session("password") 
sql="select id,name,uname,pword from supervisors where id="+id 
connstr= "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=false;Data Source=" & server.mappath("exam.mdb")  
Set Conn = Server.CreateObject("ADODB.Connection") 
Conn.Open(connstr)  
Set rs = Conn.Execute(sql)  
If rs("uname")=username and rs("pword")=password Then 
……. 
    二次用户身份鉴别技术亦可用于考生模块,原理同上。 
2.     考生环境控制 
考试环境控制是监考教师模块的功能,包括下达开考指令和下达结束考试指令,通过更改后台数据库中考试环境有关字段的值来控制考试的开始和结束。考生模块中通过查询考试环境字段的值来实现考试的控制,如考试开始前不能下载考题,考试结束后不能上传考试结果文件等。核心代码从略。 
3.     考生管理 
在考生登录后台处理程序中除验证考生姓名和学号外,还要将考生的姓名、学号与登录机器的IP地址添加到数据库的“考生注册”表中,实现学号、姓名与IP地址的“绑定”,从而防止考生互换考试用机,确保考场秩序井然。核心代码如下: 
<% 
ip=Request.ServerVariables("REMOTE_ADDR") 
id=Trim(CStr(Request.Form("T1"))) 
name=Trim(Request.Form("T2")) 
sql="select sid,student_number,student_name from students where student_number='"+id+"' and student_name='"+name+"'" 
connstr= "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=false;Data Source=" & server.mappath("exam.mdb") 
Set Conn = Server.CreateObject("ADODB.Connection") 
Conn.Open(connstr) 
Set rs = Conn.Execute(sql) 
If not rs.eof Then ‘首先验证学号和姓名 
   sql="select * from student_register where ip_address='"+ip+"'" 
   Set rs3=Conn.Execute(sql) 
   if rs3.eof Then 
       sql="select student_number,student_name from student_register where student_number='"+id+"' and student_name='"+name+"'" 
       Set rs2=Conn.Execute(sql) 
       If rs2.eof Then ‘考生尚未注册,则在student_register表中插入注册记录 
          sql="insert into student_register (student_number,student_name,ip_address) values('"+id+"','"+name+"','"+ip+"')" 
          Conn.Execute(sql) 
       End If 
       rs2.Close 
       Set rs2=Nothing 
       Session("student_number")=id 
       Session("student_name")=name 
%> 
<script language ="javascript" > 
     location.href="student_exam.asp?id=<%=id%>&name=<%=name%>"; 
</script>     
<%Else 
     Session("student_number")=id 
     Session("student_name")=name 
%> 
<script language ="javascript" > 
     location.href="student_exam.asp?id=<%=id%>&name=<%=name%>"; 
</script> 
  
<% 
End If 
rs3.close 
Set rs3=Nothing 
Else 
%> 
<script language ="javascript" > 
     window.alert("学号姓名输入错误或数据库中没有考生信息,请与监考老师联系!"); 
     location.href="index.htm"; 
</script> 
<% 
End If 
rs.Close 
Set rs=Nothing 
Conn.Close 
Set Conn=Nothing 
%> 
4.     考试结果文件上传的实现 
由于ASP本身不具有文件上传功能,本文采用共享组建ASPSmartUpload组件实现文件上传。该组件可以从网上下载。将解压后的ASPSmartUpload.dll和ASPSmartUploadUtil.dll复制到Web服务器的winnt\system32目录,并运行以下命令进行注册: 
regsvr32.exe c:\winnt\system32\ASPSmartUpload.dll 
为确保考生上传到同一目录的文件不致覆盖,上传程序还需向一包含自动增量ID值的数据表中添加一条记录,并获取新增记录的ID号作为上传文件名的一部分,从而实现上述要求。   
实现上述功能的全部代码如下: 
        <%sql="insert into file_no (file) values (0)" 
        Conn.Execute(sql) 
        sql="select max(file_no) as max_file_no from file_no" ‘获取新增记录ID 
        Set rs2=Conn.Execute(sql) 
        max_file_no=CStr(rs2("max_file_no")) 
        rs2.close 
        Set rs2=Nothing 
        file_path=Server.MapPath("result") 
        original_file_name=objUpload.Files(1).FileName 
        file_extension=objUpload.Files(1).FileExt 
        file_name=Left(original_file_name,len(original_file_name)-len(file_extension)-1) 
        file_destination=file_path+"\"+max_file_no+"_"+file_name+"."+file_extension 
        objUpload.Files(1).SaveAs(file_destination) 
        sql="insert into result (student_number,result_file_name) values('"+CStr(student_number)+"','"+file_destination+"')" 
        Conn.Execute(sql)  ‘保存文件上传记录 
        set objUpload=Nothing 
%> 
采用ASPSmartUpload组件实现文件上传也存在一定的弱点,主要是该组件不支持中文文件名和中文目录名。 
四、结语 
本文从网络环境下计算机上机考试的需求出发,设计了一套功能较为全面的考试管理系统,可以满足网络化上机考试管理的需要,能够实现基本的考试管理功能,如试题管理、考生管理、考试结果文件管理及考试过程控制等。鉴于网络的复杂性,该系统还需与其他网络管理措施(如禁用网络共享等)配合使用,共同构筑完备的网络化考试环境。 
  			
				 |