PB應用的數據庫聯接的安全防範

PB應用的數據庫聯接的安全防範

(加入日期:2001-8-15)

保存文章至硬盤】【打印文章】【字體:

分享到: 0
  隨着因特網的深入人心,網絡技術不斷髮展,數據的保密性要求也越來越高。在通常的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
3、接下來,就是編寫一個用戶接口,讓授權用戶隨時修改數據庫聯接參數。窗口界面見下圖:(文件名稱:dblogon.jpg),窗口上面的控件有:


控件名稱 控件屬性
sle_server SingleLineEdit
sle_login SingleLineEdit
sle_oldkl SingleLineEdit
sle_pass SingleLineEdit
sle_repass SingleLineEdit
cb_1 commandbutton
cb_2 commandbutton
cb_1命令按鈕的clicked事件如下:
string ls_inifile,ls_pass,ls_logid,ls_repass,ls_old
string ls_k,ls_user,ls_sql
ls_inifile ='rsgl.ini'
transaction pub_tr
pub_tr = create transaction
pub_tr.DBMS = ProfileString (ls_inifile, "database", "dbms", "")
pub_tr.LogPass = 'pub'
pub_tr.ServerName = sle_server.text
pub_tr.LogId = "pub"
pub_tr.AutoCommit = False
pub_tr.DBParm = ""
connect using pub_tr;
ls_old = sle_oldkl.text
ls_user = lower(trim(sle_logid.text))
//得到數據庫聯接原用戶口令
select passshadow into :ls_k from tbl_pub_passshadow using pub_tr;
if ls_old <> f_password(ls_k,0) then
messagebox("提示","原口令不對!")
return
end if
//檢查覈對口令
ls_pass = sle_pass.text
ls_repass = sle_repass.text
if ls_repass <> ls_pass then
messagebox("","覈對口令不對,請重新輸入!")
return
end if
SetProfileString(ls_inifile, "Database", "Servername",sle_server.text)
SetProfileString(ls_inifile, "Database", "Logid",ls_user)
//修改數據庫用戶的聯接口令
ls_sql = ' alter user '+ls_user+' identified by '+ls_pass
Execute Immediate :ls_sql using sqlca;
ls_pass = f_password(ls_pass,1)
UPDATE TBL_PUB_PASSSHADOW SET PASSSHADOW =:ls_pass using pub_tr ;
commit using pub_tr;
commit using sqlca;
disconnect using pub_tr;
close(parent)
cb_2命令按鈕的clicked事件如下:close(parent)
4、到此萬事OK。
所有代碼已在Win98環境下,用PowerBuilder 6.5測試通過。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章