扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在通常的Server/Client方式MIS开发中,由于程序要与数据库服务器保持联接,为了程序的灵活和扩充性,联接参数(用户ID和登录口令)又不能在程序中写死(其实写死也不是一种好的方法),一般的方法无外乎有两种:其一是把联接参数存放在注册表中;其二就是直接读INI文件。
本人找到一种方法,可以解决数据库应用的安全性问题,通过INI文件和数据库的巧妙处理,在程序中提供用户一种接口,可以随时修改数据库的联接参数,而又不给外人以蛛丝马迹,做到神不知鬼不觉。
实现方法如下:
1、创建INI文件,记录数据库联接的一些方便程序分发的参数DBMS、SERVERNAME、LOGID具体如下:
//创建成INI文件(rsgl.ini)
[Database]
DBMS=O84 ORACLE 8.0.4
ServerName=gxmistest //数据库服务器名
LogId=rsgl //实际的数据库登录用户
然后,在数据库中创建一个中间用户PUB,登录口令PUB,赋予PUB用户CONNECT,RESOURCE权限,再在其中创建表CREATE TABLE TBL_PUB_PASSSHADOW (PASSSHADOW VARCHAR2(50) NOT NULL)用于存放实际的数据库联接的登录口令(当然要经过加密)。加密函数网上多的是,在此就不累述。
我自已创建了一个字符串加密函数f_password(string old_str,string new_str,integer jm_mode),jm_mode参数用以区分函数的加(解)密,old_str、new_str两参数分别为加(解)密的字符串。
2、就开始编写应用程序了,在应用程序的OPEN事件中进行数据库登录联接,程序脚本如下:
string ls_inifile,ls_starttimes
string ls_logid,ls_logpass,ls_dbms
string ls_pass,ls_sql,ls_code,ls_server
//设置INI文件
ls_inifile = 'rsgl.ini'
ls_server = ProfileString (ls_inifile, "database", "ServerName", "")
ls_logid = ProfileString (ls_inifile, "database", "LogId","")
// Profile pub
SQLCA.DBMS = ProfileString (ls_inifile, "database", "dbms", "")
SQLCA.LogPass = 'pub'
SQLCA.ServerName = ls_server
SQLCA.LogId = "pub"
SQLCA.AutoCommit = False
SQLCA.DBParm = ""
connect using sqlca;
//得到用户RSGL加过密的用户口令
select passshadow into:ls_pass from tbl_pub_passshadow;
//口令解密
ls_pass = f_password(ls_pass,0)
disconnect using sqlca;
//联接到实际的数据库用户RSGL
SQLCA.ServerName = ls_server
sqlca.DBMS = ProfileString (ls_inifile, "database", "Dbms","")
SQLCA.DBParm = ProfileString (ls_inifile, "database", "Dbparm","")
sqlca.database = ProfileString (ls_inifile, "database", "database","")
sqlca.userid = ProfileString (ls_inifile, "database", "userid","")
sqlca.dbpass = ProfileString (ls_inifile, "database", "dbpass","")
sqlca.logid = ls_logid
sqlca.logpass = ls_pass//ProfileString (ls_inifile, "database", "LogPass","")
SQLCA.AutoCommit = False
connect using sqlca;
if sqlca.sqldbcode <> 0 then
choose case sqlca.sqldbcode
case 1017
MessageBox (string(sqlca.SQLDBCode),"不能联接数据库。~r错误:无效的用户名和口令.请与管理员联系!")
case 12154
MessageBox (string(sqlca.SQLDBCode),"不能联接数据库。~r错误:服务器名不存在!请与系统管理员联系.")
case 999
MessageBox (string(sqlca.SQLDBCode),"不能联接数据库。~r错误:数据库不支持你当前的安装!")
case else
MessageBox (string(sqlca.SQLDBCode),"不能联接数据库。~r错误:"+ sqlca.sqlerrtext)
end choose
halt close
else
open(w_gd_frame) //打开应用程序的主窗口
end if
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者