在pb中关于数据库密码的漏洞

会飞的熊 2009-06-12 04:10:07
我用pb写的程序,在测试中发现通过内存查看软件可以看到数据库的用户名及密码,并且是明码!!!!
也就是说这种c/S结构的程序,我安装后就可以通过内存查看器得到数据库的用户名及密码,问大家怎样解决!
我的邮箱为lihhsd@126.com, QQ911404
...全文
192 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgliebao 2011-12-12
  • 打赏
  • 举报
回复
内存查看器
可以用 UltraEdit 查看生成的 DLL 文件,看到密码没有加密。

不过把密码放到一个函数里面,就应该没问题吧
会飞的熊 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sun1976 的回复:]
比如你给一个客户操作员在数据库设置一个用户user_sa,让他用他自己输入的用户和密码连接.比如他输入user_sa,密码输入aaa,他查看内存就得到sa和aaa,这是他在输入前已经知道的,也就是他又这个访问权限,是合法访问不算入侵的.如果他不知道密码是aaa,输入别的,内存查看也只看到他输入的内容,当然那个时候程序连接不到数据库,他查看来的东西连接不到数据库

[/Quote]
共有几百用户,不好分配。
会飞的熊 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jdsnhan 的回复:]
搞不清楚LZ说的内存中查看密码是如何查看的,是在何时查看的。

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

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

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


没有绝对的安全。 这句话是有道理的。
[/Quote]
怎样清空logid 和logpass中的信息?
jdsnhan 2009-06-15
  • 打赏
  • 举报
回复
搞不清楚LZ说的内存中查看密码是如何查看的,是在何时查看的。

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

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

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


没有绝对的安全。 这句话是有道理的。
永生天地 2009-06-15
  • 打赏
  • 举报
回复
简单的字符串加密,凑合着用吧,这东西就怕别人坏您
$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

sun1976 2009-06-15
  • 打赏
  • 举报
回复
比如你给一个客户操作员在数据库设置一个用户user_sa,让他用他自己输入的用户和密码连接.比如他输入user_sa,密码输入aaa,他查看内存就得到sa和aaa,这是他在输入前已经知道的,也就是他又这个访问权限,是合法访问不算入侵的.如果他不知道密码是aaa,输入别的,内存查看也只看到他输入的内容,当然那个时候程序连接不到数据库,他查看来的东西连接不到数据库
圣殿骑士18 2009-06-15
  • 打赏
  • 举报
回复
哪用3层吧,服务端程序不容易被拷贝
lovemoreh 2009-06-14
  • 打赏
  • 举报
回复
你可以参考一下PB的示例代码。

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

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

这个过程中,在客房机中不会进行用户名和密码比对,不会出现实际的用户名和密码。
wag_enu 2009-06-14
  • 打赏
  • 举报
回复
看了很多PB做的 C/S 程序的应用系统,他们的C端都是直接连接DB的.
也就是要求 S 端的DB必须将相应的的端口暴露在网上如 SQL Server 的1433,这种结构本身存在很大的风险性.
不要说是在打开了C 端的电脑上用密码查看器查密码,就是在没有安装C端的电脑上也有人能强行的登录的SQL Server.

不知道哪位高手有没有办法改1433 为其它的端口号,并且C端怎么整也可以正常连接的.

但是也有比较昂贵的解决方案,就是购买Sybase 的 EAs 吧.
wag_enu 2009-06-14
  • 打赏
  • 举报
回复
可以把那个连接数据库的密码搞成不可复制的字符,如一些全角字符(用智能ABC输入法,但是你自己得记住是怎么来的).
会飞的熊 2009-06-14
  • 打赏
  • 举报
回复
不是求完美,我让人给搞了,就是采用这个方法,数据库中的内容一览无余!
[Quote=引用 10 楼 wangxun0997 的回复:]
又是一个要求完美的,就如SQL的过程加密码,简直就是个多余的功能,一点用都没。
[/Quote]
会飞的熊 2009-06-14
  • 打赏
  • 举报
回复
你是意思是不是说给每一个用户分配一个账号及密码?我不是太明白什么意思,希望指教。
[Quote=引用 9 楼 lovemoreh 的回复:]
引用 8 楼 lihhsd 的回复:
不是用户输入的,是数据库自身的sqlca.logid 的密码。


我回复太快了,弄错了,PB的示例代码,是直接将用户输入的用户名和密码作为连接事务的logid和password,然后将连接事务尝试进行连接。这样,就不会曝露密码了。
[/Quote]
wangxun0997 2009-06-14
  • 打赏
  • 举报
回复
又是一个要求完美的,就如SQL的过程加密码,简直就是个多余的功能,一点用都没。
会飞的熊 2009-06-14
  • 打赏
  • 举报
回复
可这就算这样我还是要对sqlca.logid设置密码的啊,也就是说如果本身这个用户是其中的一个合法用户他就可以侵入数据库的。
[Quote=引用 15 楼 lovemoreh 的回复:]
你可以参考一下PB的示例代码。

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

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

这个过程中,在客房机中不会进行用户名和密码比对,不会出现实际的用户名和密码。
[/Quote]
lovemoreh 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lihhsd 的回复:]
不是用户输入的,是数据库自身的sqlca.logid 的密码。
[/Quote]
我回复太快了,弄错了,PB的示例代码,是直接将用户输入的用户名和密码作为连接事务的logid和password,然后将连接事务尝试进行连接。这样,就不会曝露密码了。
会飞的熊 2009-06-12
  • 打赏
  • 举报
回复
不是用户输入的,是数据库自身的sqlca.logid 的密码。
newease 2009-06-12
  • 打赏
  • 举报
回复
没有绝对的安全
lovemoreh 2009-06-12
  • 打赏
  • 举报
回复
请参考PB的代码示例,不会取密码的,是拿用户输入的密码和用户名去数据库中检索,看不到密码的。
sjlion 2009-06-12
  • 打赏
  • 举报
回复
如果担心传输中的问题,可以在客户端加密,服务器端解密。
sjlion 2009-06-12
  • 打赏
  • 举报
回复
能把二进制的东东叫做明码?!!
加载更多回复(3)

754

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧