在通常的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)窗口上面的控件有
[] []
From:http://tw.wingwit.com/Article/program/PB/201311/24610.html