首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过jdbc更改用户密码。包含问号的通行证问题

通过jdbc更改用户密码。包含问号的通行证问题
EN

Stack Overflow用户
提问于 2010-12-23 19:09:07
回答 2查看 6.1K关注 0票数 4

当密码包含问号字符时,我在更改用户密码时遇到问题。到目前为止,我没有遇到任何其他字符的这个问题,它似乎特定于问号字符。

如果我使用以下sql修改sqlplus中的用户密码:

Alter user Stephen identifed by "NewPassword?" REPLACE "OldPassword";

然后它成功地更改了通行证,我可以使用新的通行证'NewPassword?‘登录。

但是,如果我通过jdbc执行相同的SQL:

final String query = "ALTER user Stephen identified by \"NewPassword?\" REPLACE \"OldPassword\"";

stmt.executeUpdate(query);

然后我无法使用传递“NewPassword?”登录。

当通过sqlplus和jdbc输入密码时,检查hashcode会发现它们是不同的。不知何故,当我在jdbc中运行该语句时,它输入的不是'NewPassword?‘。

我似乎对以下密码没有任何问题: NewPassword,新密码\,新密码‘。它看起来就像是一个问号,导致了问题。

调试显示,问号的代码点(dec)为63,因此看起来不像是中途更改的。

有没有人知道是什么导致了这种行为?我现在很困惑,我正在考虑阻止带问号的通过,以暂时绕过这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-23 20:27:41

要使用JDBC更改Oracle用户的密码,您需要做两件事:

  • 将密码直接放入SQL字符串(不能使用绑定参数),
  • 禁用转义处理。

您不能使用绑定变量,因为用户名和密码不会作为单引号字符串发送到数据库。

SQL字符串中的?被用作绑定变量占位符,因此,SQL字符串在某些时候会被Oracle JDBC破坏。在语句上禁用转义处理会阻止这种情况的发生。尝试:

代码语言:javascript
运行
复制
Statement s = conn.createStatement();
s.setEscapeProcessing(false);
s.executeUpdate("ALTER user Stephen identified by \"newPassword?\" replace \"oldPassword\"");

如果以编程方式设置密码,则代码还应确保新密码和旧密码不包含任何"字符,以避免SQL注入。

票数 5
EN

Stack Overflow用户

发布于 2010-12-23 19:14:10

尝试使用PreparedStatement实现它,看看是否会遇到同样的问题。问号在PreparedStatements中用作占位符,所以可能JDBC驱动程序搞混了。它不应该,但可能值得检查。

代码语言:javascript
运行
复制
PreparedStatement p = conn.prepareStatement("ALTER user Stephen identified by ? replace ?");
p.setString(1, "NewPassword?");
p.setString(2, "OldPassword");
p.execute();

如果这起作用,那么很可能是驱动程序中的错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4518210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档