如何解决通过jdbc更改用户密码包含问号的通行证存在问题
要使用JDBC更改Oracle用户的密码,您需要做两件事:
- 将密码直接放在SQL字符串中(不能使用绑定参数),
- 禁用转义处理。
您不能使用绑定变量,因为用户名和密码不会作为单引号字符串发送到数据库。
将?
在SQL字符串被视为绑定变量占位符,因为这样的SQL字符串在由Oracle
JDBC某些时候得到错位。在语句上禁用转义处理可阻止这种情况的发生。尝试:
Statement s = conn.createStatement();
s.setEscapeProcessing(false);
s.executeUpdate("ALTER user Stephen identified by \"newPassword?\" replace \"oldPassword\"");
如果以编程方式设置密码,则代码还应确保新密码和旧密码不包含任何"
字符,以避免SQL注入。
解决方法
当密码包含问号char时,我无法更改用户密码。到目前为止,我在使用其他任何char时都没有遇到这个问题,这似乎是问号char所特有的。
如果我使用以下sql
Alter user Stephen identifed by "NewPassword?" REPLACE "OldPassword";
更改sqlplus中的用户密码:然后它成功更改了密码,我可以使用新密码“ NewPassword?”登录。
但是,如果我通过jdbc执行相同的SQL: 然后,我将无法使用密码“ NewPassword?”登录。
final String query = "ALTER user Stephen identified by \"NewPassword?\"
REPLACE \"OldPassword\"";
stmt.executeUpdate(query);
通过sqlplus和jdbc输入密码后,检查密码的哈希码表明它们是不同的。不知何故,当我在jdbc中运行该语句时,它输入的不是“
NewPassword?”。
我使用以下密码似乎没有任何问题:NewPassword,NewPassword \,NewPassword’。这似乎只是引起问题的问号。
调试显示问号的代码点(dec)为63,因此看起来好像在中间没有更改。
有谁知道会导致这种行为的原因吗?目前,我很茫然,我正在考虑防止带问号的通行证暂时绕过此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。