“&”字符会破坏存储在 web.config 中的密码

Posted

技术标签:

【中文标题】“&”字符会破坏存储在 web.config 中的密码【英文标题】:The "&" character breaks passwords that are stored in the web.config 【发布时间】:2013-01-14 12:00:00 【问题描述】:

我有一个在 IIS 7.5 上运行的 ASP.NET MVC3 C# .NET 应用程序。

我们在代码中模拟了一个 Windows NT 服务帐户,以便将文档读/写到文件共享中。用户 id 在代码中编译,服务帐户密码存储在 web.config 文件中。

密码包含一个 & 字符(即:p&ssword)。

这破坏了网站。访问该站点时,我们收到此错误:“抱歉,处理您的请求时发生错误”。

这是使用密码的代码:

    var password = ConfigurationManager.AppSettings.Get(Common.SVC_PWD);

    bool isSuccess = LogonUser(
        @"my_svc_acct",
        "my.domain.net",
        password,
        LOGON32_LOGON_NEW_CREDENTIALS,
        LOGON32_PROVIDER_DEFAULT, ref token
    );

为什么这会导致网站崩溃?

【问题讨论】:

我认为是因为 web.config 被视为 XML 文档 - 请参阅此处***.com/questions/3824351/… 我的第一个猜测是配置文件中的密码不正确。但是您是否尝试过调用 GetLastError (msdn.microsoft.com/en-us/library/windows/desktop/…) 来查看错误是什么?我还必须补充一点,在配置文件中存储明文密码不是一个好主意。我至少会对其进行加密。 【参考方案1】:

我怀疑您没有在web.config 文件中正确编码密码。请记住,web.config 是一个 XML 文件,因此必须对实体进行编码。

代替

my&password 

试试

my&password

您可以使用诸如FreeFormatter.com 之类的网站来转义/取消转义 XML 字符串。

【讨论】:

每个人如何使用它的 URL 小心!带有“&”的网址不是带有“&”的 URL。在将其应用于您的 URL 地址之前,请不要忘记用代码替换它。在找到原因之前,我陷入了这个陷阱并处理了一整天的错误。【参考方案2】:

您需要将编码值放入 web.config。拉取后它会正确读出,但在配置文件本身中需要对其进行编码。

例如:

密码:your&password(你所期望的)

编码版本:your&password(应该存储在您的 web.config 中)

读取值的包装器方法应自动将其解编码为your&password

您需要对所有“特殊”字符执行此操作:

< = &lt;
> = &gt;
" = &quot;
' = &apos;
& = &amp;

【讨论】:

我正在使用 VS2015 where &或 &两个结果相同,即“&”但我想要“&” 谢谢。在 VS2017+ 中运行良好【参考方案3】:

使用 CDATA 将密码存储在 web.config 中

用这个替换密码

<![CDATA[MyPassw&rd]]>

【讨论】:

不起作用:您不能将 CDATA 部分放在属性值中。 Joe 是正确的,这不能在配置文件中用作属性值 @user99513 提示:如果您同意某人的评论,您可以点赞他/她的评论,而不是写一条新评论,只提及您同意之前的评论者。 我完全同意@user1451111

以上是关于“&”字符会破坏存储在 web.config 中的密码的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 XML 中 URL 中的特殊字符

为 asp.net 存储密钥、密码的安全方法

Azure 存储帐户防火墙规则适用于表但会破坏 blob 存储

为啥 Spring 批处理多线程步骤会破坏 ItemProcessor 中的其他存储库休眠查询?

C# - 将 HTML 字符串切割成单独的行而不破坏 HTML 标签

当键有点字符时,对象会被破坏[重复]。