基于JSP的教师工资管理系统的安全机制设计Word文档格式.docx
《基于JSP的教师工资管理系统的安全机制设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于JSP的教师工资管理系统的安全机制设计Word文档格式.docx(6页珍藏版)》请在冰豆网上搜索。
教师工资管理系统是学校内不可缺少的应用系统,它的应用减轻了财务管理人员对工资数据的统计工作,使学校中与财务部门相联系的各部门工作得到简化,这些部门可以方便、快捷、及时地统计数据并将数据传递给财务部门,同时教师员工也可以及时查询每个月工资的详细信息。
本系统主要是结合以上三方面的需求而设计的,系统主要涉及三个部门,财务处(核算工资)、教务处(核算课时津贴)以及办公室(核算考勤数据),教务处与办公室分别将每月核算后的数据保存在数据库中,财务处通过调用得到教务处与办公室的数据,从而核算每位教师员工的工资数据,普通教师可以登录教师工资查询系统查询每个月工资的详细信息,系统功能图如图1所示:
图1
教师工资管理系统主要是管理工资数据,通常工资数据是不允许泄漏的,不排除系统会受到非法入侵,例如:
SQL注入、用户密码被猜解、非置信用户的入侵等等,同时合法用户的无意识非法操作也会给系统的安全造成威胁,如果不应用相应的安全防范机制,必定会受到严重的损失。
因此教师工资查询系统的安全性必须得到保证。
安全的系统首先应构建于安全的平台之上,现在比较流行的开发平台有.Net和JSP等,但利用.Net平台开发出来的系统运行速度相对较慢,重要的是安全性比JSP要弱一些,因此本系统选择了JSP作为开发平台。
JSP技术可以生成页面上的动态内容,用HTML或者XML标识来设计和格式化最终页面。
生成内容的逻辑被封装在标识和JavaBeans组件中,JavaBean可以将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象,所有的脚本在服务器端运行。
在服务器端,JSP引擎解释JSP标识和小脚本,生成所请求的内容,并且将结果以HTML(或者XML)页面的形式发送回浏览器。
这样做一方面增加了代码的可重用性,另一方面有助于保护代码不被泄漏。
1教师工资管理系统安全机制设计
1.1数据库的安全机制
通常在设计系统时,只为登录前台系统的用户设置不用的权限,而忽略了访问数据库用户的权限设置。
本系统选择SQLSever作为数据库平台,在数据库中建立三个用户组分别为:
SysAdmin(系统管理员组)、SalAdmin(工资管理员组)、ComUser(普通用户组)并赋于不同的权限,设置权限的SQL语句如下:
SysAdmin组:
grantallonbulletin,userstogroupSysAadminwithgrantoption
//系统管理员对公告表和用户表具有所有操作权限
SalAdmin组:
grantallonsalary,subsidy,timetable,bulletintogroupSalAadminwithgrantoption
//工资管理员对工资表、课贴表、考勤表、公告表具有所有操作权限
ComUser组:
grantselectonsalary,subsidy,timetable,bulletintogroupComUserwithgrantoption
//普通用户对工资表、课贴表、考勤表、公告表只有选择的权限
然后建立三个用户分别为sysclient、salclient、comclient,将这三个用户分别加入到相应的用户组中,从而实现在访问数据库时保证其安全。
用户对数据库的的访问过程如下图:
1.2用户三次登录失败后的处理
为了避免利用枚举法猜解用户的密码,在本系统中定义了相应的处理规则,即如果某用户连续三次登录失败时,应及时封住此用户名,在于管理员联系核实后方可正常登录工资管理系统。
interrnum=CheckUser.loginErrNum();
if(errnum<
3){
Stringmesg=“登录失败,您还有”+(3-errnum)+”次登录机会!
”;
}else{
Stringmesg=“连续三次登录失败,帐号已被封冻,请及时与管理员联系!
}
returnmesg;
1.3对用户输入数据的有效性进行验证
在系统中有一些需要用户输入的数据,例如管理员会查询教师姓名为“陶乐”的用户信息时,系统所产生的SQL语句为:
select*fromuserswhereuname='
陶乐'
,但也可以输入:
or'
1'
='
1,此时系统所产生的SQL语句为:
Rong'
,由于条件式为真,这样就可以把所有用户的信息都输出出来,这是不允许的。
因此当用户输入数据并提交时,必须对用户输入的数据进行验证,方法是列举出所有非法字符,只要用户输入的数据在非法字符范围内则提交失败,代码如下:
Stringinj_str="
'
|?
|and|exec|insert|select|delete|update|c
Ount|*|%|chr|mid|master|truncate|char|declare|;
|or|-|+|,"
;
Stringfilter_stra[]=inj_filter.split("
[|]"
);
for(inti=0;
i=0){returntrue;
}
returnfalse;
1.4对用户名和密码进行加密
考虑到登录系统的用户名和密码的安全性,用于登录教师工资管理系统的所有用户名和密码都需要进行加密。
现存的大多数系统是利用MD5的加密解密算法,由于经过MD5加密后的数据很容易被破解,所以在这里使用的是DES对称加密算法,DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法,因此选择此算法。
DES算法需要三个参数:
工作密钥、原始数据、工作模式。
当工作模式为加密时,用工作密钥对原始数据进行加密,生成64位的密码形式;
加密原代码如下:
Security.addProvider(newcom.sun.crypto.provider.SunJCE());
StringAlgorithm="
DES"
KeyGeneratorkg=KeyGenerator.getInstance(Algorithm);
SecretKeydeskg=kg.generateKey();
//生成密钥
Cipherc1=Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE,deskg);
//将加密后的用户名和密码转换为字符串,方便保存
StringcryptName=newString(c1.doFinal(name.getBytes()));
StringcryptPasd=newString(c1.doFinal(password.getBytes()));
//分别将用户名密文、密码密文和工作密钥存入数据库
当工作模式为解密时,则用工作密钥将加密后的数据进行解密,生成原始数据。
解密原代码如下:
//从数据库读入用户名密文cryptName、密码密文cryptPasd和工作密钥deskg
nameByte=cryptName.getBytes();
pasdByte=cryptPasd.getBytes();
c1=Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE,deskg);
byte[]decryptName=c1.doFinal(nameByte);
StringoriginName=newString(decryptName);
//原始用户名
byte[]decryptPasd=c1.doFinal(pasdByte);
StringoriginPasd=newString(decryptPasd);
//原始密码
String[]box={originName,originPasd};
returnbox;
1.5必不可少的身份验证
HTTP是一个不记录状态的协议,当用户利用合法的用户名和密码登录系统后,再进入到其它页面,如果这些页面没有身份验证,那么非法用户也可以利用URL地址直接打开页面查看数据。
因此,在打开每一个页面时首先要对用户的合法性进行验证,不合法用户则转移到error.html页面。
session机制则是一种在客户端与服务器之间保持状态的解决方案,而且session机制相对较安全。
在用户进入系统后用session变量记录用户名和权限。
代码如下:
session.setAttribute("
usr"
"
普通用户"
autho"
管理员"
当用户进入每一个页面时,把这些值取回来,从而判断用户是否合法,代码如下:
name=session.getAttribute("
authority=session.getAttribute("
if(name.equals(null)||!
authority.equals("
)){
response.sendRedirect("
error.htm"
}
1.6防止用户提交数据后刷新页面
在工资管理系统中,输入课贴数据、考勤数据等操作须在一次操作过程中完成,防止用户刷新页面使得数据再次被提交。
防止刷新的基本思路是在网页中设置一个Hidden表单域,其值是在服务器端随机生成一个session值,Hidden域值和session值在用户做提交动作时是同步修改的,但如果用户刷新页面,那么session值和Hidden值就不相等,则直接给出错误提示。
java.lang.StringhiddenKey="
hiddenKey"
//hidden表单域key值
java.lang.StringhiddenValue=java.lang.String.valueOf(System.
currentTimeMillis());
//hidden表单域v