[超难问题]跳过

yuzl32 2005-12-19 05:23:07
问题描述如下:
经过transFunc()函数处理后,下面语句中的SQLCA.logpass 无论赋什么值,connect 语句总会成功,即SQLCA.SQLCODE = 0

PS:transFunc是VC动态库的函数.


transFunc();

SQLCA.DBMS = "o73 oracle v7.3"
SQLCA.logid = 'hsd'
SQLCA.logpass = 'fafoiafuoid' // 无论赋什么除了有'@'的字符
SQLCA.servername = 'MyDB'
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox('提示',SQLCA.SQLErrText)
goto lbErr
end if

请问这可能是什么一个机理啊?言者有分!up有分!有话就有分!分不够我再开贴加!
...全文
264 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuzl32 2005-12-23
  • 打赏
  • 举报
回复
很感谢 lzheng2001(1加1) 的解答,我想问题到此自己应该怎么去解决这个问题了.
宾子寻月人 2005-12-23
  • 打赏
  • 举报
回复
up
lzheng2001 2005-12-22
  • 打赏
  • 举报
回复
无什么特别的,你找一下直连的原理的资料应该可以找到答案的,或许这只是系统的漏洞,就是一个BUG! 可能与动态库载入内存的关. 就象我上面说的ASA有类似的情况出现一样.
yuzl32 2005-12-22
  • 打赏
  • 举报
回复
为了方便看问题,我再把问题贴一下:

1、下面的语句上连续的
2、如果注释掉transFunc函数,那么SQLCA.logpass必须赋正确的密码才可以登陆系统
3、经过transFunc()函数处理后,下面语句中的SQLCA.logpass 无论赋什么值,connect 语句总会成功
disconnect;
transFunc();
SQLCA.DBMS = "o73 oracle v7.3"
SQLCA.logid = 'hsd'
SQLCA.logpass = 'fafoiafuoid' // 无论赋什么除了有'@'的字符
SQLCA.servername = 'MyDB'
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox('提示',SQLCA.SQLErrText)
goto lbErr
end if

这到底会是怎么样的设计思想?大家随便讲.这大概会是怎么实现的啊?

PS:transFuns 是自定义VC动态库里面的函数.

言者有分! up有分! 说一次就有一次的分! 有话就有分! 分不够我再开贴加!
yuzl32 2005-12-22
  • 打赏
  • 举报
回复
To lzheng2001(1加1)

1、很感谢您的提示,正如您所说的,它确实把数据库用户名和密码写死了(更改数据库密码测试过,不能登陆),再查看它动态库的导入文件发现有很多引用OCI.dll(oracle数据库下)中的函数.
2、采用您的方法,模拟如下:

Tran2 = create transaction

Tran2.DBMS = "o73 oracle v7.3"
Tran2.logid = 'hsd'
Tran2.logpass = 'pwhsd' // 正确的密码
Tran2.servername = 'MyDB'
connect using Tran2;

IF Tran2.SQLCODE=0 THEN
MessageBox('OK','第一个事务连接成功')
ELSE
MessageBox('Err','第一个事务连接失败')
END IF

disconnect ; // 这里即使注释掉,也同样的提示

SQLCA.DBMS = "o73 oracle v7.3"
SQLCA.logid = 'hsd'
SQLCA.logpass = 'fafoiafuoid' // 错误的密码
SQLCA.servername = 'MyDB'
connect;

if SQLCA.SQLCODE = 0 THEN
Open(w_main)
ELSE
MessageBox('失败','第二个事务连接失败')
END IF

得到如下提示:
第一个事务连接成功
第二个事务连接失败

yuzl32 2005-12-22
  • 打赏
  • 举报
回复
To cbz0660(珍)

如果去掉上面,直接写成这样:
disconnect;
transFunc();
//SQLCA.DBMS = "o73 oracle v7.3"
//SQLCA.logid = 'hsd'
//SQLCA.logpass = 'fafoiafuoid' // 无论赋什么除了有'@'的字符
//SQLCA.servername = 'MyDB'
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox('提示',SQLCA.SQLErrText)
goto lbErr
end if
提示用户名密码失败
lzheng2001 2005-12-22
  • 打赏
  • 举报
回复
DLL动态库问题! 都是用同一个DLL来连接的. 这个是不是BUG,还看看原函数的原码才知道.
sbks 2005-12-22
  • 打赏
  • 举报
回复
有点不可思议
使用了transFuns()进行数据库连接后,之后的sqlca怎么接管到这个数据库连接呢?
yuzl32 2005-12-21
  • 打赏
  • 举报
回复
To rightyeah(众妙之门)

谢谢你的提醒,但是这些语句是连续的,connect应该作用它最近的值才是啊,这又会是怎么做到的呢?

言者有分! up有分! 说一次就有一次的分! 有话就有分! 分不够我再开贴加!
rightyeah 2005-12-21
  • 打赏
  • 举报
回复
是不是对sqlca重新赋值了?就是用自定义的对象取代了原有的Transaction,并且在自定义对象内使用了忽略logpass的某些代码
yuzl32 2005-12-21
  • 打赏
  • 举报
回复
To wu_07(一只狗不孤单,想一只狗才孤单)

在1 或者 2 位置加上disconnect 后,它竟然也可以连地上!

transFunc();

// 1

SQLCA.DBMS = "o73 oracle v7.3"
SQLCA.logid = 'hsd'
SQLCA.logpass = 'fafoiafuoid' // 无论赋什么除了有'@'的字符
SQLCA.servername = 'MyDB'
disconnect; // 2 加上
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox('提示',SQLCA.SQLErrText)
goto lbErr
end if
cbz0660 2005-12-21
  • 打赏
  • 举报
回复
UP,你看看SQLCA.DBMS = "o73 oracle v7.3"
SQLCA.logid = 'hsd'
SQLCA.logpass = 'fafoiafuoid' // 无论赋什么除了有'@'的字符
SQLCA.servername = 'MyDB'
disconnect; // 2 加上
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox('提示',SQLCA.SQLErrText)
goto lbErr
end if
把這些注銷掉能不能連上?
lzheng2001 2005-12-21
  • 打赏
  • 举报
回复
现在你无法查看transFunc()的内容,只好想办法猜想它的内容, 首先你修改数据库登录密码,再执行你的PB代码,看能否正确连接, 如果不能,说明这个函数可能用了硬代码把数据库名及密码写死了! 至于为什么执行它PB就可以连接,这个有可能是利用了oracle的BUG写的函数,你试试连接最新版本的ORACLE,看能否正确连接.

我以前试过用两个程序连接同一个ASA数据库,只要其中一个应用正确连接上ASA,另外一个即使没有密码也能正确连接上. 所以,你可以试试建两个事务对象,先成功连接一个,然后再用另一个密码错误的事务对象再连同一个数据库看是否可以连上

另外,你还可以用DLL查看工具查看这个DLL的函数及它所依赖的DLL,就可以大概知道它是否引用了oracle的DLL或者PB本身的DLL来实现对数据库的连接

最后,出于安全性的考虑,你不知道这个函数有什么用,就不要用它,
pmz 2005-12-20
  • 打赏
  • 举报
回复
transFuns()已经连接了数据库
yuzl32 2005-12-20
  • 打赏
  • 举报
回复
1、下面的语句上连续的
2、如果注释掉transFunc函数,那么SQLCA.logpass必须赋正确的密码才可以登陆系统
3、经过transFunc()函数处理后,下面语句中的SQLCA.logpass 无论赋什么值,connect 语句总会成功
transFunc();
SQLCA.DBMS = "o73 oracle v7.3"
SQLCA.logid = 'hsd'
SQLCA.logpass = 'fafoiafuoid' // 无论赋什么除了有'@'的字符
SQLCA.servername = 'MyDB'
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox('提示',SQLCA.SQLErrText)
goto lbErr
end if

这到底会是怎么样的设计思想?大家随便讲.这大概会是怎么实现的啊?

PS:transFuns 是自定义VC动态库里面的函数.

言者有分! up有分! 说一次就有一次的分! 有话就有分! 分不够我再开贴加!
yuzl32 2005-12-20
  • 打赏
  • 举报
回复
为了方便看问题,我再把问题贴一下:

1、下面的语句上连续的
2、如果注释掉transFunc函数,那么SQLCA.logpass必须赋正确的密码才可以登陆系统
transFunc();
SQLCA.DBMS = "o73 oracle v7.3"
SQLCA.logid = 'hsd'
SQLCA.logpass = 'fafoiafuoid' // 无论赋什么除了有'@'的字符
SQLCA.servername = 'MyDB'
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox('提示',SQLCA.SQLErrText)
goto lbErr
end if

这到底会是怎么样的设计思想?大家随便讲.这大概会是怎么实现的啊?

PS:transFuns 是自定义VC动态库里面的函数.

言者有分! up有分! 说一次就有一次的分! 有话就有分! 分不够我再开贴加!
yuzl32 2005-12-20
  • 打赏
  • 举报
回复
可以连.
我是想transFuns函数怎么能让SQLCA.logpass="任何串" 都可以连接到系统(起保护密码作用)
PS:transFuns 是自定义VC动态库里面的函数.

言者有分! up有分! 说一次就有一次的分! 有话就有分! 分不够我再开贴加!
xiaoplx 2005-12-20
  • 打赏
  • 举报
回复
transFuns()?
搞不清你的问题
yaiger 2005-12-20
  • 打赏
  • 举报
回复
把connect改成connect using sqlca;
看看还能连接成功不?
yuzl32 2005-12-20
  • 打赏
  • 举报
回复
我的猜想是可能在transFuns函数(VC)中已经连接到了数据库,并做了处理.
但是无论transFuns函数怎么处理,它下面的语句依然会覆盖掉密码啊(即SQLCA.logpass="任何串"),并且connect 作用的应该是覆盖掉的SQLCA.奇怪的是它为什么还可以连接上系统?
加载更多回复(11)

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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