如何在SQL Server连接字符串中隐藏用户名和密码?

7

在我重新发明轮子之前,是否有一种标准方法来至少隐藏 SQL Server 连接字符串中的密码?

(使用 C# 编写)

我的应用程序是高度多线程的,并且知道多个数据库。为了帮助故障排除和调试,在各种位置记录连接字符串。我无法控制使用该产品的客户使用什么连接字符串,因此在其中找到密码并不罕见。我知道这一点,因为人们经常开启 DEBUG 级别的日志记录并将日志文件与问题报告一起发送给我们,而这些日志包含他们的数据库密码(结果我们的支持票据系统包含密码)。

我意识到最佳实践是不要将密码放入连接字符串中,但是这部分超出了我的控制范围(除非我们改变应用程序,使其拒绝运行,如果您提供具有未加密密码的连接字符串...对我来说,这似乎有些龙套了)。

真正想记录的是:

Server=myServerAddress;Database=myDataBase;User Id=****;Password=*****;

我对用户ID/名称是否敏感或记录是否有用存在疑虑,欢迎对此发表评论。

我可以构建一个简单的正则表达式(例如/Password=[^;]+/),但在此之前,我想看看是否有其他情况需要考虑,特别是如果已经完成了这项工作。


1
这个应用程序是用哪种语言编写的? - mellamokb
1
最好使用SSPI上下文,但我猜在你的情况下这不是一个选项。 - Crono
@mellamokb 我感觉可以肯定是.NET语言,因为OP在SO上的历史记录,但我仍然希望确认一下。 :) - Crono
2
我之所以问是因为在.NET中,例如,您可以使用内置的类DbConnectionStringBuilder轻松解析和操作连接字符串。 - mellamokb
1
@mellamokb 添加一个答案,这样 OP 就可以接受它了。使用连接字符串生成器会比我提出的答案更容易且可能更有效。 - Crono
显示剩余4条评论
2个回答

8

好的,这个答案实际上应该归@mellamokb所有,但这是我使用的:

    /// <summary>
    /// Accepts a SQL Connection string, and censors it by *ing out the password.
    /// </summary>
    /// <param name="connectionString"></param>
    /// <returns></returns>
    public static string CensorConnectionString(string connectionString)
    {
        var builder = new DbConnectionStringBuilder() {ConnectionString = connectionString};
        if (builder.ContainsKey("password"))
        {
            builder["password"] = "*****";
        }
        return builder.ToString();
    }

注意事项:

  • 它似乎保留了属性的顺序。
  • 除了密码(当然),我并没有找到任何输出与输入不同的情况。但我仍然不会依赖于此。对于我的目的而言,我不在意,因为这是调试信息,人们可以看出正在使用哪个数据库,这是目标。
  • 我故意用5个星号始终屏蔽密码:我不想泄露有关密码长度的信息。

-1
中,你可以做的一件事是将连接字符串拆分为键/值字符串:
var keyValues = connectionString.Split(';');

然后浏览每个字符串并再次拆分:

var listToKeep = new List<string>();

foreach (var keyValue in keyValues)
{
    var key = keyValue.Split('=')[0].Trim();

    if (key != "Password" && key != "Pwd") listToKeep.Add(keyValue);
}

现在,您可以通过重新连接其他字段来重新创建不包含密码的连接字符串:

var safeConnectionStringForLog = string.Join(";", listToKeep.ToArray());

如评论中mellamokb所建议的,您可能想要使用SqlConnectionStringBuilder来解析连接字符串,删除密码并获取新字符串。当然,您的连接字符串可能没有使用完全相同的参数或顺序。

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