PB应用的数据库联接的安全防范

2024-04-13 06:48

本文主要是介绍PB应用的数据库联接的安全防范,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随着因特网的深入人心,网络技术不断发展,数据的保密性要求也越来越高。在通常的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两参数分别为加(解)密的字符串。

-- 创建登陆,无密码策略,密码不过期
CREATE LOGIN [test_l] WITH PASSWORD='pwd1213',DEFAULT_DATABASE=[db_1], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;
GO 
USE db_1;
GO
-- 创建用户
CREATE USER [test_u] FROM LOGIN [test_l];
GO 
-- 授权
GRANT SELECT ON dbo.table1 TO [test_u];
GO

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测试通过。

 

 

   附:解密源代码

/*******************************************************************

函数名称:f_decryptpbpassword()

参数:     as_orginalpassword string 原始密码

返回值: string 解密后文本

功能描述:解密PB数据库连接描述密码

创建人:  康剑民

创建日期:2006-04-27

版本号: V1.0

*******************************************************************/

string ls_temp,ls_return=''

integer i,li_count,li_ascii

nvo_numerical lnv_numerical

 

if len(as_orginalpassword) < 2 or as_orginalpassword = '00' then return ''

 

as_orginalpassword = left(reverse(as_orginalpassword),len(as_orginalpassword) - 2)

li_count = ceiling(len(as_orginalpassword) / 2)

for i = 1 to li_count

       ls_temp = mid(as_orginalpassword,(i - 1) * 2 + 1,2)

       li_ascii = lnv_numerical.of_hextodecimal(ls_temp)

       ls_temp = char(li_ascii)      

       ls_return = ls_return + ls_temp

next

 

return ls_return

 

/*******************************************************************

函数名称:of_hextodecimal()

参数:     as_hexdata string 16进制数据

返回值: unsignedlong 10进制数据

功能描述:16进制数据转为10进制数据

创建人:  康剑民

创建日期:2006-04-27

版本号:V1.0

*******************************************************************/

char        lch_char[]

unsignedlong       lul_decimal=0

integer li_dec[48 to 70], i, li_len

 

for i = 48 To 57

       li_dec[i] = i - 48

next

 

for i = 65 To 70

       li_dec[i] = i - 55

next

 

as_hexdata = lower(as_hexdata)

lch_char = as_hexdata

li_len = len (as_hexdata)

 

for i = 1 to li_len

       choose case lch_char[i]

       case '0' to '9', 'a' to 'f'

              lul_decimal = lul_decimal * 16 + li_dec[asc(lch_char[i])]

       case else

              return lul_decimal

       end choose   

next

return lul_decimal

写作日期:2006-05-15

这篇关于PB应用的数据库联接的安全防范的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899418

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/