SQL 连接字符串中 } 和 ' 的密码字符问题

Ama*_*das 5 sql-server odbc password

我正在使用 ODBC 驱动程序 17 连接到 MSSQL 服务器。为了避免 SQL 注入的可能性,请在 {} 中包含密码。现在,如果我提供像 }qwerty1234 这样的密码,我将面临问题。即以 } 开头的密码将给出无效的连接字符串错误。有人可以提出同样的解决方案吗?

另外,在密码中使用 ' (单引号)是否存在任何已知问题?

Joh*_* N. 10

介绍

\n

The Heap\xe2\x84\xa2 \xe2\x80\x93 Consultancy \xc2\xa9\xc2\xae上存在一种情况,其中 McNets 遇到连接字符串问题。

\n

我快速地说:

\n
\n

我希望您的连接字符串密码不包含以下任何一个:_ % @ ?

\n
\n

...McNets 很快回复:

\n
\n

密码中有一个@

\n
\n

事实证明,@(at 符号)破坏了 McNets 应用程序中的连接字符串。

\n

观察结果

\n

我之前曾遇到过 SQL Server 静默安装文件中的 %(百分比)符号问题。我运行的命令类似于以下内容:

\n
E:\\setup.exe /ACTION=INSTALL /CONFIGURATIONFILE=%~dpn0.ini /IACCEPTSQLSERVERLICENSETERMS /SAPWD="MyPassword%WillFail"\n
Run Code Online (Sandbox Code Playgroud)\n

由于 SA 密码包含 % 符号,因此安装例程不会在相应的对话框中显示该密码。这%WillFail视为附加的“DOS”参数。

\n

生成数据库登录和系统的密码

\n

多年来,我生成了很多密码,其中一些失败了,而另一些则成功了。这取决于:

\n
    \n
  • 使用密码的地方
  • \n
  • 我正在访问哪个 RDBMS 系统
  • \n
\n

这可以是:

\n
    \n
  • Oracle 连接字符串
  • \n
  • SQL Server 安装
  • \n
  • ODBC 连接字符串
  • \n
  • DOS命令
  • \n
  • 其他连接字符串
  • \n
  • C#
  • \n
  • 视觉基础
  • \n
  • MySQL
  • \n
  • PostgreSQL
  • \n
\n

通用密码生成器

\n

为了改进生成密码的过程,我开始使用 KeePass 中提供的密码生成器生成长密码(15 个以上字符长度)。

\n

我的密码生成器排除了以下大部分字符:

\n
E:\\setup.exe /ACTION=INSTALL /CONFIGURATIONFILE=%~dpn0.ini /IACCEPTSQLSERVERLICENSETERMS /SAPWD="MyPassword%WillFail"\n
Run Code Online (Sandbox Code Playgroud)\n

断裂原因

\n

排除某些字符的一些原因只是因为某些 RDBMS,而其他字符会破坏静默安装文件。我将尝试列出一些明显的原因和其他一些可能不太明显的原因,这些原因导致某些字符在密码中使用时失败。

\n

= equal

\n
    \n
  • 在 ODBC 连接字符串中,等号用于分隔参数和值。
  • \n
  • 在 SQL Server 静默安装中,等号将破坏密码。
  • \n
\n

" double quote

\n
    \n
  • 当参数以双引号开头时,破坏 ODBC 连接字符串中参数=值设置的密码。
  • \n
  • 根据所使用的语言,中断各种编程语言中的连接字符串。
  • \n
\n

\' single quote(类似于双引号)

\n
    \n
  • 当参数以单引号开头时,破坏 ODBC 连接字符串中参数=值设置的密码。
  • \n
  • 根据所使用的语言,中断各种编程语言中的连接字符串。
  • \n
\n

% percentage

\n
    \n
  • setup.exe当与运行提供登录密码的BAT/CMD 文件结合使用时,SQL Server 静默安装会失败。\n例如 SETUP.BAT 文件的内容:

    \n
      E:\\setup.exe /ACTION=INSTALL /CONFIGURATIONFILE=%~dpn0.ini /IACCEPTSQLSERVERLICENSETERMS /SAPWD="MyPassword%WillFail"\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

@ at sign (commercial at)

\n
    \n
  • 使用符号时会破坏 Oracle 连接字符串:user/password@oracle_sid。密码中的 @ 被解释为password和之间的终止符oracle_sid
  • \n
  • 根据 McNets 的观察,破坏了一些连接字符串。
  • \n
\n

& ampersand

\n
    \n
  • 用于中断 ODBC 连接字符串。
  • \n
\n

? question mark

\n
    \n
  • 如果我没记错的话,这用于破坏非常旧的 ODBC 连接字符串(或者是 OLE DB),因为问号是“询问参数”
  • \n
\n

_ underscore

\n
    \n
  • 我不是 100% 确定为什么下划线最终会进入我的数据库密码不需要的字符列表,但我认为这与发布某个 Web 应用程序的密码中包含下划线的 HTTP 请求有关。(Andriy M.在评论中提问
  • \n
\n

# hash

\n
    \n
  • 显然,根据注释,哈希值可以用作MySQL中的密码,但是当它存储在配置文件中时,哈希值后面的任何内容都会被解释为注释。(感谢Scott N在评论中提到这一点
  • \n
\n

} right curly bracket

\n
    \n
  • 正如我正在回答的这个问题中OP提到的,将破坏SQL Server ODBC连接中的连接字符串。
  • \n
\n

其他角色

\n

我收藏的其他角色之所以能出现在我的收藏中,是因为我在信息技术领域和作为数据库管理员 26 年多的时间里进行了观察。它们可能不是决定性的,但可能会在尝试连接数据库时遇到错误时对其他人有所帮助。它们还可能有助于防止在为各种 RDBMS 和用户生成密码和/或连接字符串时出现问题。

\n

回答您的问题

\n
\n

有人可以提出同样的解决方案吗?

\n
\n

您也许可以使用}反斜杠转义\\ie \\},但这取决于字符串所在的位置。

\n

我不会}在您的密码中使用 。

\n
\n

另外,在密码中使用 \' (单引号)是否存在任何已知问题?

\n
\n

请参阅我上面的列表以了解可能的问题。

\n

参考

\n

这个答案取自我在标题为“数据库密码”的topanswers 上的博客文章。

\n


Sea*_*ser 6

现在,如果我提供像 }qwerty1234 这样的密码,我将面临问题。即以 } 开头的密码将给出无效的连接字符串错误。

您可以使用 ODBC 转义字符和序列来执行此操作:{}

如果密码是,}qwerty1234那么您需要对其进行转义,尽管我发现这取决于应用程序。

我使用 .net ODBC 连接字符串生成器编写了一个小应用程序,它给出的内容如下:

Driver={ODBC Driver 17 for SQL Server};Server=.;UID=odbclogin;PWD=}qwerty1234

它没有转义它,但是当使用其他需要转义的字符时,它确实用另一个右大括号转义了右大括号。

Driver={ODBC Driver 17 for SQL Server};Server=.;UID=odbclogin;PWD={}}qwerty1234!@#$;}

我建议,如果应用程序无法使用您输入的值,那么它就无法正确处理转义序列或执行某些操作,您需要使用 或 手动{}转义}