通过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所特有的。
如果我使用以下sqlAlter 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,因此看起来好像在中间没有更改。
有谁知道会导致这种行为的原因吗?目前,我很茫然,我正在考虑防止带问号的通行证暂时绕过此问题。