PB應用的資料庫聯接的安全防範
來源:互聯網
上載者:User
關鍵字
安全
防範
隨著網際網路的深入人心,網路技術不斷發展,資料的保密性要求也越來越高。 在通常的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", "dat abase","") 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_pas sshadow 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測試通過。 責任編輯 趙毅 zhaoyi#51cto.com TEL:(010)68476636-8001 給力(0票)動心(0票)廢話(0票)專業(0票)標題党(0票)路過(0票) 原文:PB應用的資料庫聯接的安全防範 返回網路安全首頁