在通常的Server/Client方式MIS开发中由于程序要与数据库服务器保持联接为了程序的灵活和扩充性联接参数(用户ID和登录口令)又不能在程序中写死(其实写死也不是一种好的方法)一般的方法无外乎有两种其一是把联接参数存放在注册表中其二就是直接读INI文件
本人找到一种方法可以解决数据库应用的安全性问题通过INI文件和数据库的巧妙处理在程序中提供用户一种接口可以随时修改数据库的联接参数而又不给外人以蛛丝马迹做到神不知鬼不觉
实现方法如下
创建INI文件记录数据库联接的一些方便程序分发的参数DBMSSERVERNAMELOGID具体如下
//创建成INI文件(rsglini)
[Database]
DBMS=O ORACLE
ServerName=gxmistest //数据库服务器名
LogId=rsgl //实际的数据库登录用户
然后在数据库中创建一个中间用户PUB登录口令PUB赋予PUB用户CONNECTRESOURCE权限再在其中创建表CREATE TABLE TBL_PUB_PASSSHADOW (PASSSHADOW VARCHAR() NOT NULL)用于存放实际的数据库联接的登录口令(当然要经过加密)加密函数网上多的是在此就不累述
我自已创建了一个字符串加密函数f_password(string old_strstring new_strinteger jm_mode)jm_mode参数用以区分函数的加(解)密old_strnew_str两参数分别为加(解)密的字符串
就开始编写应用程序了在应用程序的OPEN事件中进行数据库登录联接程序脚本如下
string ls_inifilels_starttimes
string ls_logidls_logpassls_dbms
string ls_passls_sqlls_codels_server
//设置INI文件
ls_inifile = rsglini
ls_server = ProfileString (ls_inifile database ServerName )
ls_logid = ProfileString (ls_inifile database LogId)
// Profile pub
SQLCADBMS = ProfileString (ls_inifile database dbms )
SQLCALogPass = pub
SQLCAServerName = ls_server
SQLCALogId = pub
SQLCAAutoCommit = False
SQLCADBParm =
connect using sqlca;
//得到用户RSGL加过密的用户口令
select passshadow into:ls_pass from tbl_pub_passshadow;
//口令解密
ls_pass = f_password(ls_pass)
disconnect using sqlca;
//联接到实际的数据库用户RSGL
SQLCAServerName = ls_server
sqlcaDBMS = ProfileString (ls_inifile database Dbms)
SQLCADBParm = ProfileString (ls_inifile database Dbparm)
sqlcadatabase = ProfileString (ls_inifile database database)
sqlcauserid = ProfileString (ls_inifile database userid)
sqlcadbpass = ProfileString (ls_inifile database dbpass)
sqlcalogid = ls_logid
sqlcalogpass = ls_pass//ProfileString (ls_inifile database LogPass)
SQLCAAutoCommit = False
connect using sqlca;
if sqlcasqldbcode <> then
choose case sqlcasqldbcode
case
MessageBox (string(sqlcaSQLDBCode)不能联接数据库~r错误无效的用户名和口令请与管理员联系!)
case
MessageBox (string(sqlcaSQLDBCode)不能联接数据库~r错误服务器名不存在!请与系统管理员联系)
case
MessageBox (string(sqlcaSQLDBCode)不能联接数据库~r错误数据库不支持你当前的安装!)
case else
MessageBox (string(sqlcaSQLDBCode)不能联接数据库~r错误+ sqlcasqlerrtext)
end choose
halt close
else
open(w_gd_frame) //打开应用程序的主窗口
end if
接下来就是编写一个用户接口让授权用户随时修改数据库联接参数窗口界面见下图(文件名称dblogonjpg)窗口上面的控件有
[] []