防止百分号字符转换

10

我正在尝试在我们的MVC3项目中使用Web部署工具包,总体上部署工作正常,但是我们连接到数据库的密码包含一个百分号(%)字符,后面跟着两个数字。部署工具似乎将其转换为十六进制字符替换。是否有一种方法可以防止此字符替换并仍然使开发人员机器上的连接字符串可用?我尝试在Web.Debug.Config文件中放入替换字符甚至添加了%25而不仅仅是%,以尝试仅替换%字符,但它仍然替换了完整值。

示例:

<connectionStrings>
    <add name="MyDB" connectionString="server=Server1;uid=user1;pwd=abc123%72;database=Database1;"
</connectionStrings>

被替换为

<connectionStrings>
    <add name="MyDB" connectionString="server=Server1;uid=user1;pwd=abc123r;database=Database1;"
</connectionStrings>

尝试使用 %% 转义百分号? - Jacob Krall
@Jacob - 这样就更接近了。我输入了"pwd=abc123%%72",在转换后得到了"pwd=abc123%r"。 - Adam Gritt
这样怎么样:pwd=abc123%%372 - Jacob Krall
@Jacob - 依旧无法,现在它输出pwd=abc123r。 - Adam Gritt
似乎http://serverfault.com/questions/212687/iis-7-0-web-deploy-authentication-fails-after-changing-windows-password-help也有同样的问题,但没有答案。 - Jacob Krall
嗨,亚当,你能解释一下你正在采取的步骤以及它在哪里失败了吗?根据你的问题,我无法将其拼凑在一起,因此很难在这里给出建议。 - Sayed Ibrahim Hashimi
2个回答

13

将连接字符串中的 pwd 部分设置为:

pwd=abc123%252572

经过多次试验,我发现这是一个双重转换。第一次转换将%2525 转换为 %25,第二次转换将 %25 转换为 %。这就是为什么当你使用 %2572 时,它会变成 r (%72 是字母 r 的 Unicode 编码)。对我来说,这似乎是解析器中的一个 bug。也许有更有经验的人可以给出更好的解释。


这个解决方案对我来说完美地运行了。我不知道它是一个错误还是解析器的未记录操作,但如果有人有更好的解释,我也很感兴趣。感谢最终提出解决方案。我之前通过使用Parameters.xml文件并将连接字符串作为参数来“解决”了这个问题,但我更喜欢使用内置的web/app.config功能来根据构建类型(Debug/Release/Production/Test等)进行指定。 - Adam Gritt
不用客气。我想知道这个能否在微软网站上发布以获得更多关注。很高兴我能回答,即使有些晚了。 - mateuscb
@mateuscb:这个问题几年前就已经被报告了。请看这里,而且这个漏洞仍然存在。将%替换为%25只需要进行一次即可解决我的问题。 - Peter
@Peter 如果你只使用了“%25”就能让它工作,那么问题似乎已经解决了。当我遇到这个问题时,我们必须使用“%2525”。 - mateuscb

0

我遇到了完全相同的问题(当然密码不同)。

为了使连接到数据库的连接字符串在开发人员机器上正常工作,我修改了发布设置以使用“不同”的连接字符串。

对于您的示例: web.config 将包含:

<connectionStrings>
<add name="MyDB" connectionString="server=Server1;uid=user1;pwd=abc123%72;database=Database1;"
</connectionStrings>

在发布设置中右键单击项目,选择发布...,转到设置->数据库。对于数据库MyDB,请输入以下内容:
 server=Server1;uid=user1;pwd=abc123%72;database=Database1;

这使我的开发机器保留了与数据库的连接,主机机器无论是直接发布还是通过Teamcity都能自动使用正确的连接字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接