当密码包含问号字符时,我在更改用户密码时遇到问题。到目前为止,我没有遇到任何其他字符的这个问题,它似乎特定于问号字符。
如果我使用以下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,因此看起来不像是中途更改的。
有没有人知道是什么导致了这种行为?我现在很困惑,我正在考虑阻止带问号的通过,以暂时绕过这个问题。
发布于 2010-12-23 20:27:41
要使用JDBC更改Oracle用户的密码,您需要做两件事:
您不能使用绑定变量,因为用户名和密码不会作为单引号字符串发送到数据库。
SQL字符串中的?被用作绑定变量占位符,因此,SQL字符串在某些时候会被Oracle JDBC破坏。在语句上禁用转义处理会阻止这种情况的发生。尝试:
Statement s = conn.createStatement();
s.setEscapeProcessing(false);
s.executeUpdate("ALTER user Stephen identified by \"newPassword?\" replace \"oldPassword\"");如果以编程方式设置密码,则代码还应确保新密码和旧密码不包含任何"字符,以避免SQL注入。
发布于 2010-12-23 19:14:10
尝试使用PreparedStatement实现它,看看是否会遇到同样的问题。问号在PreparedStatements中用作占位符,所以可能JDBC驱动程序搞混了。它不应该,但可能值得检查。
PreparedStatement p = conn.prepareStatement("ALTER user Stephen identified by ? replace ?");
p.setString(1, "NewPassword?");
p.setString(2, "OldPassword");
p.execute();如果这起作用,那么很可能是驱动程序中的错误。
https://stackoverflow.com/questions/4518210
复制相似问题