当前位置: 代码迷 >> PB >> 在pb中关于数据库密码的破绽
  详细解决方案

在pb中关于数据库密码的破绽

热度:67   发布时间:2016-04-29 07:14:02.0
在pb中关于数据库密码的漏洞
 我用pb写的程序,在测试中发现通过内存查看软件可以看到数据库的用户名及密码,并且是明码!!!!
也就是说这种c/S结构的程序,我安装后就可以通过内存查看器得到数据库的用户名及密码,问大家怎样解决!
[email protected], QQ911404 

------解决方案--------------------
你可以参考一下PB的示例代码。

它是这样的思路:
每个用户都在数据库中指定为数据库用户,指定相应的密码。

然后将用户输入的用户名和密码,作为连接事务的用户名和密码,再进行连接。用户名或者密码不对,就无法成功连接。

这个过程中,在客房机中不会进行用户名和密码比对,不会出现实际的用户名和密码。
------解决方案--------------------
比如你给一个客户操作员在数据库设置一个用户user_sa,让他用他自己输入的用户和密码连接.比如他输入user_sa,密码输入aaa,他查看内存就得到sa和aaa,这是他在输入前已经知道的,也就是他又这个访问权限,是合法访问不算入侵的.如果他不知道密码是aaa,输入别的,内存查看也只看到他输入的内容,当然那个时候程序连接不到数据库,他查看来的东西连接不到数据库

------解决方案--------------------
简单的字符串加密,凑合着用吧,这东西就怕别人坏您
$PBExportHeader$gf_encode.srf
global type gf_encode from function_object
end type

forward prototypes
global function string gf_encode (string as_code)
end prototypes

global function string gf_encode (string as_code);//字符串加密
String ls_key_para
ls_key_para="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
String ls_rtncode,ls_code1,ls_code2,ls_temp
Long ll_len,ll_i,ll_j
Integer li_code1,li_code2
ll_len = Len(as_code)
IF ll_len <= 0 THEN Return ""
ls_rtncode = ""
ll_j = 1
FOR ll_i = 1 TO ll_len
li_code1 = ASC(Mid(as_code,ll_i,1))
li_code2 = ASC(Mid(ls_key_para,ll_j,1))
li_code1 += li_code2
DO WHILE li_code1 > 127
if li_code1 > 127 then
li_code1 = li_code1 - 127
end if
LOOP

ls_temp = char(li_code1)
ls_rtncode += ls_temp
ll_j ++
if ll_j > len(ls_key_para) then ll_j = 1
next

return ls_rtncode
end function







$PBExportHeader$gf_decode.srf
global type gf_decode from function_object
end type

forward prototypes
global function string gf_decode (string as_code)
end prototypes

global function string gf_decode (string as_code);//解密
string ls_key_para
ls_key_para="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
String ls_rtncode,ls_code1,ls_code2,ls_temp
Long ll_len,ll_i,ll_j
Integer li_code1,li_code2
ll_len = Len(as_code)
IF ll_len <= 0 THEN Return ""
ls_rtncode = ""
ll_j = 1
FOR ll_i = 1 TO ll_len
li_code1 = ASC(Mid(as_code,ll_i,1))
li_code2 = ASC(Mid(ls_key_para,ll_j,1))
li_code1 -= li_code2
DO WHILE li_code1 <= 0
if li_code1 <= 0 then
li_code1 = li_code1 + 127
end if
LOOP

ls_temp = char(li_code1)
ls_rtncode += ls_temp
ll_j ++
if ll_j > len(ls_key_para) then ll_j = 1
next
return ls_rtncode
end function


------解决方案--------------------
搞不清楚LZ说的内存中查看密码是如何查看的,是在何时查看的。

如果在登录时,那无话可说,没有绝对的安全,随便写个东西驻留在客户端就能获得密码。

如果是在运行时,那就不对了。登陆成功后,应该立刻清空logid 和logpass的 

还有,可以考虑使用第三方用户,第三方用户指向生产用户,对应了密文,生产用户解密后连接生产库。


没有绝对的安全。 这句话是有道理的。
  相关解决方案