当前位置: 首页 > 面试题库 >

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

湛鸿
2023-03-14
问题内容

当密码包含问号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,因此看起来好像在中间没有更改。

有谁知道会导致这种行为的原因吗?目前,我很茫然,我正在考虑防止带问号的通行证暂时绕过此问题。


问题答案:

要使用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注入。



 类似资料:
  • 所以我有一个很奇怪的问题。我创建了一个表单,允许用户更改密码。 它确实改变了他们的密码。但是它把他们的密码改成了Laravel显然无法识别的东西。 因此,如果我使用“修补匠”手动将密码更新为类似“测试”的东西;我将能够成功地更改我的密码。但是,一旦我将密码更改为某物(例如123456),表单将不接受密码。 当我注销用户并尝试使用新密码登录时;它不允许我登录。 很明显,拉威尔没有识别新密码。 代码如

  • PostgreSQL知道几个在名称中使用问号字符的时髦ASCII-art运算符,例如这些JSON运算符: 字符串是否作为JSON值中的顶级键存在? 这些数组字符串中是否有任何作为顶级键存在? 是否所有这些数组字符串都作为顶级键存在? 问题是官方的PostgreSQL JDBC驱动程序似乎不能正确解析包含此类操作符的SQL字符串。它假设问号是一个普通的JDBC绑定变量。以下代码... ...引发异常

  • 问题内容: 我正在寻找一种在Java App(使用JDBC)中打开Access MDB文件的方法。 快速的Google搜索建议我为此需要JDBC-ODBC Bridge。 这是否意味着我需要配置要在其上运行应用程序的每个系统,以便为要打开的MDB提供ODBC DSN? 还有一个问题(因为我以前从未使用过ODBC):通信是通过某种套接字(以客户机/服务器方式)还是通过方法/函数调用(例如嵌入Derb

  • 我正在尝试连接到本地DB210.5Express-C服务器。这是一个测试环境,所以我不关心安全性。 我能够连接到命令行处理器(在Windows上运行),并更改了和的配置设置。当时我希望能够在没有身份验证的情况下进行连接(我重新启动了DB2服务),但仍然出现了一个错误。 当我尝试在没有用户名/密码的情况下连接时 我得到了错误:com.ibm.db2.jcc.am.SqlSynTaxErrorExce

  • 如有任何帮助,我们将不胜感激!